2016-04-08 10 views
2

ハスケルでは、私はなぜ部分的なアプリケーションfoldr id型チェックを理解していません。部分的なアプリケーション `foldr id` typecheckはなぜですか?

関連のタイプはfoldrの最初の引数は(a->b->b)ある

> :t foldr id 
foldr id :: a -> [a -> a] -> a 

> :t foldr 
foldr :: (a -> b -> b) -> b -> [a] -> b 

> :t id 
id :: a -> a 

です。対照的に、idのタイプはa->aです。それらは互換性がありません。

+4

':t id ::(a - > a) - >(a - > a)'は参考になるかもしれません。 – dfeuer

+2

@ChadGilbert編集していただきありがとうございます。あなたは '<! - language-all:haskell - >'を一度だけ書くことができます。 –

答えて

10

a -> b -> bは実際にはa -> (b -> b)です。 id :: a -> aので、これはb -> baを統合し、私たちがすべてです

id :: c -> c     -- type variable consistently renamed for uniqueness 
foldr :: (a -> (b -> b)) -> b -> [ a ] -> b  | c ~ a , c ~ b->b 
foldr  id   :: b -> [ c ] -> b 
foldr  id   :: b -> [b -> b] -> b 

を取得します。

それはどうしますか?

foldr f z [x,y,...,n] = f x (f y (... (f n z)...)) 

foldr id z [x,y,...,n] = 
    = id x (id y (... (id n z)...)) 
    = x ( y (... ( n (id z))...)) 
    = ( x . y . ... . n . id) z 
    = foldr (.) id [x,y,...,n] z 

したがって、foldr id = foldr ($) = flip (foldr (.) id)これは非常にいいです。出力と入力の型が一致するため、リストに保持されている関数はすべてスタックアップします。

+0

明快にするために 'id :: c - > c'に名前を変更しますか? – dfeuer

+0

@dfeuerもしあなたがそれが最高だと思えば。 –

+0

ありがとう、非常に明確な答え。 –

関連する問題