foldlを直す

Posted on April 7, 2014, Tags: Haskell




http://www.well-typed.com/blog/90/

foldl foldl

foldl


foldl  

Prelude.foldlData.List.foldl'

foldl




Haskellerfoldlfoldrfoldl'使 Real World Haskell
`foldl`のサンクの挙動のため、実アプリではこの関数を使わないようにするのが望ましい。
特に問題がない場合でも、`foldl`の使用は不要なオーバーヘッドを払うことになる。
代わりに`Data.List`をインポートして、`foldl'`を使うこと。


なんでData.Listのfoldlの実装がPreludeにないんですか?

 
追加:なんで`foldl'`がデフォルトじゃないんですか?



OKfoldlfoldl'
foldl :: (b->a->b) ->b-> [a] -> b
foldl f a []     = a
foldl f a (x:xs) = foldl f (f a x) xs

foldl' :: (b->a->b) ->b-> [a] -> b
foldl' f a []     = a
foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs

foldl'  


Haskell
foldl f z [x1, x2, ..., xn] = (...((z`f` x1) `f` x2) `f`...) `f` xn

foldr f z [x1, x2, ..., xn] = x1 `f` (x2 `f` ... (xn`f`z)...)

foldlfoldr  

 使 使 使1(+) 2(:)

foldlfoldr使 (foldl) (foldr)


Haskellfoldl
foldl (+) 0 (1:2:3:[])
          =  foldl (+) (0 + 1)             (2:3:[])
          =  foldl (+) ((0 + 1) + 2)       (3:[])
          =  foldl (+) (((0 + 1) + 2) + 3) []
          =            (((0 + 1) + 2) + 3)


foldl' (+) 0 (1:2:3:[])
          =  foldl' (+) 1 (2:3:[])
          =  foldl' (+) 3 (3:[])
          =  foldl' (+) 6 []
          =             6

foldl' foldl'`+

(foldl)foldl




foldl  

foldlf   f1  foldr

f1   foldl foldrfoldl

foldl' lastlast'
last  = foldl  (\_ y ->y) (error "empty list")

last' = foldl' (\_ y ->y) (error "empty list")


> last [1,undefined,3]
3
> last' [1,undefined,3]
*** Exception: Prelude.undefined

 

foldl'  
last [x]    = x
last (_:xs) = last xs
last []     = error "empty list"

foldlfoldl' 

sumfoldl'foldl Haskell(+)Num    foldlfoldr使 sumHaskell foldl'

Haskell15 foldl'foldl使3 1 1Web   foldl 使 foldl使

foldlfoldl


foldl 



24Haskell 1.0 seq foldl

6Haskell 1.3seq Haskell 1.3seqEval使 Haskell 1.3foldl'
foldl' :: Eval b => (b -> a ->b) -> b -> [a] ->b

Haskell 1.4Haskell 98seqEval foldl HugsGHCfoldl'

 foldl'

seqfoldl使

MirandaHaskell1Haskell 1.05seq

Orwellfoldl


Orwell OrwellHaskell MirandaHaskell Orwellfoldlfoldl'  Orwell Philip Wadler Phil


An Introduction to Orwell
(DRAFT)
Philip Wadler
1 April 1985
In the standard prelude:

lred f a []  =  a
lred f a (x:xs) = lred f (f a x) xs

5Haskell 1.0
An Introduction to Orwell 6.00
by Philip Wadler
revised by Quentin Miller
Copyright 1990 Oxford University Computing Lab

In the standard prelude:

foldl :: (a -> b ->a) -> a -> [b] -> a
foldl f a []  =  a
foldl f a (x:xs)  =  strict (foldl f) (f a x) xs

strict使 Orwellstrict
strict :: (a->b) ->a-> b
strict f x =x`seq` f x

Haskell($!)

Orwellfoldl

 foldlHaskellseq 

Just do it!


foldlData.Listimport foldl使  foldl使 

Orwell24 Haskell 1.0  

foldl


 foldl'2  

 bang
foldl' :: (b->a->b) ->b-> [a] -> b
foldl' f a []     = a
foldl' f a (x:xs) = let !a' = f a x
                     in foldl' f a' xs


foldl'' :: (b->a->b) ->b-> [a] -> b
foldl'' f !a []     = a
foldl'' f !a (x:xs) = foldl'' f (f a x) xs

 WHNF 

 
foldl'  (\_ y ->y) undefined [1] = 1
foldl'' (\_ y ->y) undefined [1] = undefined

foldl'  

 GHCfoldl'unbox IntInt#unbox foldl'  foldl'' unbox GHC

Don Stewartstream fusion foldl' 

foldl  



comments powered by Disqus