2011-01-04 9 views

答えて

10

:は "cons"演算子であり、headが左の値その尾部はオペレータの右側の値である。したがって、0 : [1, 2, 3]はリスト[0, 1, 2, 3]です。

次のようにf 1 0を評価することで、この関数の動作を確認してください:

f 1 0 = 0 : f 3 1 

すなわちf 1 0は先頭に0からなる新しいリストとその尾とf 3 1によって返されたリストを作成した結果です。以下同様に、f 3 1は:

f 3 1 = 1 : f 5 4 
f 3 1

すなわち、ヘッドに1からなる新しいリストとその尾としてf 5 4によって返されたリストを作成した結果です。

したがって、関数は再帰的にリストを構築します。さらに、無限にテール再帰的です(終了条件がないため)、無限に長いリストが生成されます。最初のライン、f :: Integer -> Integer -> [Integer]として

、これはfは、2つの整数(Integer -> Integer)を受け取り、整数([Integer])のリストを返す関数であることを示しています。厳密に言えば、fは整数(Integer)をとり、整数をとり、関数のカリングの結果として整数のリスト(Integer -> [Integer])を返す別の関数を返します。これは、Haskellやその他の関数型プログラミング言語を深く理解していくにつれて慣れ親しんだコンセプトです。

5

タイプエラーと構文エラーが含まれているため、問題のコードは何も実行されません。あなたが最後のビットをハイライトから見ることができるように--はHaskellではコメントを開始しますので

f :: Integer -> Integer --> [Integer] 

はコメントです。結果として、fの宣言された型はInteger -> Integerであり、これは間違っています。この変更を修正するには-->->に変更してください。ここで

f i n = n : f (i+2) (n+i] 

あなたは開口部(、その後、クロージング]を持っています。明らかにそれは間違っている。この変更を修正するには(n+i](n+i)に変更してください。

:は、リスト型のコンストラクタです:それは完了だことを、ここでは固定のコードが何をするかだと今

x : xsは、xを頭に、xsを尾に持つリストです。 n : f (i+2) (n+i)は、n : (f (i+2) (n+i))と解釈されます(あなたが信じているようには(n : f) (i+2) (n+1)ではありません)。したがって、頭部がnであり、その尾部がf (i+2) (n+1)の結果であるリストが作成されます。

関連する問題