2016-04-19 7 views
2

基本的には、headを使って最初の要素を乗算し、tailとnullでリストを反復処理することになっています。私はhaskellにはとても新しいので、私はフロー制御を全く理解していません。以下のコードはすでに動作しています。私はちょうどテールを使用してリストを繰り返し処理する必要があります。head、tail、nullを使ってリスト内の要素を生成する

module Blueprint where 
import Prelude 


x=1 
prod :: [Integer] -> Integer 
prod n 
|null n == True = 0 
|null n== False = x*head n 

いくつかの擬似コードを追加:

x=1 
prod :: [Integer] -> Integer 
prod n 
|null n == True = 0 
|null n== False = x*head n do tail n repeat until null n == true 

すべてのヘルプは素晴らしいことです。ありがとう。

+3

パターンマッチングがより安全で簡単な場合に部分的な機能を使用してこのようなタスクを実行するための指導は、犯罪行為とみなされます。 ; -P – chi

+0

そうですね、私の教授はそうでないと思っています:D – HoRnsUp

+0

私は実際にこの種の運動をする教授を理解することができます:彼らはあなたが頭、尾などを理解しているかどうかを確かめたいと思います。それでも、もし私がハスケルを教えなければならないなら、パターンマッチングがよく理解されているかどうかを確認するために、それらを言及しません。私も警備員を延期するつもりです:最近、警備員は多くの虐待を見てきました。ガード 'null n == True'と' == False'の上にさえも避けるべきです。 ( 'x == True'は' x'と等価で、最後の場合は 'otherwise'を使用します - もちろん、パターンマッチングではガードはありません...) – chi

答えて

6

あなたはほとんどそれを持っています!リストの末尾の積を得るには、再帰的にprodを呼び出して、リストの先頭に結果を乗算するだけです。

prod :: [Int] -> Int 
prod xs 
    | null xs = 1 
    | otherwise = head xs * prod (tail xs) -- note recursive call to prod 

ちなみに、それはむしろ手動headtailnullを呼び出すよりも、あなたのリストを分解するをマッチングパターンを使用することがより慣用的です。

prod [] = 1 
prod (x:xs) = x * prod xs 

これが上記のコードとどのように同じであるかをご覧ください。

Terserはまだとしてprodを表現している。

prod = foldr (*) 1 

foldrは、一度にリスト1つの要素を消費するための標準Haskellのイディオムです。それは、次のように定義されています:その定義でfaccため1ため

foldr :: (a -> b -> b) -> b -> [a] -> b 
foldr f acc [] = acc 
foldr f acc (x:xs) = f x acc (foldr f acc xs) 

代替*、あなたは上からprodを回復します。

+0

ありがとう! – HoRnsUp

関連する問題