myReverse :: [a] -> [a]
myReverse = foldl (\a x -> x:a) []
foldl is (a -> b -> a) -> a -> [b] -> a
ラムダ関数は、明らかに括弧内にあります。 foldl
はどこから初期値を得るのですか?この場合、[b]
とは何ですか?このHaskell foldl lambda関数がどのように機能しているかをトレースできますか?
myReverse :: [a] -> [a]
myReverse = foldl (\a x -> x:a) []
foldl is (a -> b -> a) -> a -> [b] -> a
ラムダ関数は、明らかに括弧内にあります。 foldl
はどこから初期値を得るのですか?この場合、[b]
とは何ですか?このHaskell foldl lambda関数がどのように機能しているかをトレースできますか?
たとえば、myReverse [1,2,3]
の評価を進めることができます。私たちは、だから我々は、[1]にと何かが結果を精査したときに、このベータの減少は、実際にのみ発生し、各ベータ還元工程のための重要な注意点を
myReverse [1,2,3,4]
-- definition of myReverse
= foldl (\a x -> x:a) [] [1,2,3]
-- definition of foldl (x:xs case)
= foldl (\a x -> x:a) ((\a x -> x:a) [] 1) [2,3]
-- beta reduction [1]
= foldl (\a x -> x:a) [1] [2,3]
-- definition of foldl
= foldl (\a x -> x:a) ((\a x -> x:a) [1] 2) [3]
-- beta reduction
= foldl (\a x -> x:a) [2,1] [3]
-- definition of foldl
= foldl (\a x -> x:a) ((\a x -> x:a) [2,1] 3) []
-- beta reduction
= foldl (\a x -> x:a) [3,2,1] []
-- definition of foldl ([] case)
= [3,2,1]
を持ってfoldl
foldl f z [] = z
foldl f z (x:xs) = foldl f (f z x) xs
の定義が必要です。進んでいるfoldl
として、f
の繰り返しのアプリケーションは、私たちが本当に(f = \a x -> x:a
場合)を取得することであるので、サンクとして構築:
foldl f [] [1,2,3]
foldl f (f [] 1) [2,3]
foldl f ((f 2 (f [] 1))) [3]
foldl f (((f 3 ((f 2 (f [] 1)))))) []
(((f 3 ((f 2 (f [] 1))))))
我々はそのアキュムレータにおける厳格であり、このサンクを防ぐfoldl'
を、持っている理由です築き上げる。
初期値は[]
です。この場合の[b]
はのfoldl
と同じで、[a]
はmyReverse
です。
myReverse :: [a] -> [a]
myReverse = foldl (\a x -> x:a) []
は等価したがって
myReverse :: [a] -> [a]
myReverse xs = foldl (\a x -> x:a) [] xs
ように書き換えることができ、折り畳み機能はラムダ\a x -> x:a
であり、初期値は[]
であり、そしてオーバー折り畳むリストがxs
あります。