ふむ

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 を全然理解していない証拠。