f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
誰かが私にそれが何をするのか説明してもらえますか? [0,1,4,9,16 ..] が返されることはわかっていますが、その方法とn : f
意味がわかりません
:
は「cons」演算子であり、先頭が演算子の左側の値で末尾が演算子の右側の値である新しいリストを作成します。これ0 : [1, 2, 3]
がリスト[0, 1, 2, 3]
です。
f 1 0
次のように評価して、この関数の動作を確認します。
f 1 0 = 0 : f 3 1
ieは、先頭が で構成され、末尾が によって返されるリストf 1 0
を作成した結果です。同様に、次のとおりです。0
f 3 1
f 3 1
f 3 1 = 1 : f 5 4
ieは、先頭が で構成され、末尾が によって返されるリストf 3 1
を作成した結果です。1
f 5 4
したがって、関数は再帰的にリストを作成します。さらに、(終了条件がないため) 無限に末尾再帰的であるため、無限に長いリストになります。
最初の行についてはf :: Integer -> Integer -> [Integer]
、これはが 2 つの整数 ( ) を取り、整数のリスト ( ) を返すf
関数であることを示しています。厳密には、整数 ( ) を取り、整数を取り、関数のカリー化の結果として整数のリスト ( ) を返す別の関数を返します。これは、Haskell やその他の関数型プログラミング言語を深く理解するにつれて慣れてくる概念です。Integer -> Integer
[Integer]
f
Integer
Integer -> [Integer]
質問のコードは、型エラーと構文エラーが含まれているため、何もしません。
f :: Integer -> Integer --> [Integer]
強調表示からわかるように--
、Haskell では がコメントを開始するため、最後のビットはコメントです。結果として、 の宣言された型はf
isInteger -> 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)