2016-04-08 10 views
2

In Haskell verstehe ich nicht, warum die Teilanmeldung foldr id Typchecks.Warum wird die Teilapplikation `folddr id` geprüft?

Relevante Typen sind

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

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

> :t id 
id :: a -> a 

Das erste Argument von foldr(a->b->b) ist. Im Gegensatz dazu ist der Typ ida->a. Sie sollten nicht kompatibel sein.

+4

': t id :: (a -> a) -> (a -> a)' könnte lehrreich sein. – dfeuer

+2

@ChadGilbert danke für die Bearbeitung. Zu Ihrer Information können Sie '' nur einmal schreiben. –

Antwort

10

Weil a -> b -> b eigentlich a -> (b -> b) ist. Seit id :: a -> a vereint diese a mit b -> b und so bekommen wir

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 

Das ist alles.

Also was macht es?

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 

So foldr id = foldr ($) = flip (foldr (.) id) das ist ganz schön zu haben. Die in der Liste enthaltenen Funktionen werden alle übereinander gestapelt, da die Ausgabe- und Eingabetypen übereinstimmen.

+0

Umbenennen zu 'id :: c -> c' für Klarheit? – dfeuer

+0

@dfeuer wenn du denkst es ist das beste. –

+0

Danke, sehr klare Antwort. –