Listに対する foldr
は、次のように定義されています。
(参考にしたのはこちらですが、実際にはもうちょっと効率のいい実装になっているみたいです)
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr _ z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
これをご覧いただくとわかるかと思いますが、
第2引数に当たるz
、つまりfuuさんが書いたコードで言うところの []
は、
第3引数であるリストが空の場合、すなわちリストの要素をすべて処理しきった後に f
の第2引数として渡されます。
そして、それ以外の場合、第1引数に渡した関数f
に対して、
「リストの各要素」と「リストの残りの要素をfoldr
した結果」を渡しています。
例えばfuuさんのコードの場合、(:)
にリストの先頭の要素1
と、foldr (:) [] [2, 3, 4]
を渡すことになります。
リストの残りの要素については、自分の手で計算してみてください。よくわかると思います。
ちなみに、fuuさんが期待したように動作するのはfoldl
の方です(第1引数に渡す関数の引数の順番が異なるので注意)。
> foldl (\accum x -> x : accum) [] [1, 2, 3, 4]
[4,3,2,1]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/08 10:52 編集
2018/10/08 11:22
2018/10/08 11:54