ふむ
Haskell わかんねー。何でもそうだけど、いろんなコードをみて、書いて、試してみるしかないのね。
何してる?
無名関数(lambda)
\x -> 式
無名関数。ラムダ。lambda (この綴り、覚えにくい)。
Hugs> :t \x y -> x + y \x y -> x + y :: Num a => a -> a -> a Hugs> print ((\x y -> x + y) 1 2) 3
iterate
iterate f x
無限リストを作成する。x が初期値。リストの先頭は初期値と同じ。リストの 2番目以降に f を通した結果が入る。無限リストなので、take 等である一定の箇所を取り出さないと、永遠に計算が続く(続いた)。
Hugs> :t iterate iterate :: (a -> a) -> a -> [a] Hugs> take 5 (iterate (+ 1) 0) [0,1,2,3,4]
!!
[a] !! n
リストの n 番目の要素を取り出す。存在しない要素を取り出そうとするとエラー。
Hugs> :t (!!) (!!) :: [a] -> Int -> a Hugs> [1,2,3,4] !! 1 2 Hugs> [1,2,3,4] !! 5 Program error: Prelude.!!: index too large Hugs> "aiueo" !! 4 'o'
謎
repeated は引数を 3 つ必要とする。
Prelude> let repeated f n = \x -> (iterate f x)!!n Prelude> :t repeated repeated :: (a -> a) -> Int -> a -> a Prelude> repeated (++ " ring-ring") 2 "Ring:" "Ring: ring-ring ring-ring"
why? ぱっと見た感じでは 2 つなんだけどな。"=" の左側にある変数(?)が引数の数ではないらしい。まあ、引数が 2 つだとしたら、x は誰が与えてくれるのかわからないからなぁ。
で、ここを見て少し納得。
Prelude> let f1 = \x -> x + 1 Prelude> :t f1 f1 :: Integer -> Integer Prelude> f1 10 11
この場合だと、引数はの数は 0 でなく 1 というのはわかる。f1 は x を引数をとり、x に 1 を加える、と読める。なので、repeated は感覚的にいうとこんな感じなのか (エラーになるけど)?
(repeated f n) = \x -> (iterate f x) !! n
lambda を使わないで書くとこう?
Prelude> let repeated f n x = (iterate f x) !! n Prelude> :t repeated repeated :: (a -> a) -> Int -> a -> a Prelude> repeated (++ " ring-ring") 2 "Ring:" "Ring: ring-ring ring-ring"
この書き方だと、直感的に引数は 3 つだな、と理解できる。
Haskell を全然理解していない証拠。