2017-12-21 20 views

答えて

2

たとえば、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です。

0
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あります。

関連する問題