schemeでfoldlを実装してみた(関数名fold-left)
それでこんな関数を書いたら動いたけど、書いた本人が理解できてない...
(define (fold-left kons knil clist)
(cond
[(empty? clist) knil]
[else (fold-left kons (kons (first clist) knil)(rest clist))]))
おかしいな。なんで動くんだろう?
参考にした記事
Emacs Lisp
- 追記
読みなおしてるうちに理解できた。
リストが空ならknilを返すのは分かる。
elseの内容が微妙にまだ分かり切ってないけど、
リストの最初の一つを取り出して、knilにくっつけて新しいknilを作ってるみたい。
clist=(1, 2, 3) knil=empty
一回目 (fold-left cons empty (1, 2, 3))
二回目 (fold-left cons (1, e) (2, 3))
三回目 (fold-left cons (2, 1, e) (3))
四回目 (fold-left cons (3, 2, 1, e) (empty))
五回目 (3, 2, 1, e)
五回目はリストが空だから、knilを返している。このknilは今まで作ってきたリストだ。
(empty) → (1) → (2,1) → (3,2,1)となっているのでこれでリストが完成している。
こういうことっぽい。
次は高階関数について悩むことになりました(;´Д`)
それは次の記事かな?