2013-09-06 7 views
9

Wenn ich schreiben:foldr vs foldr1 Verwendung in Haskell

> let xs = [1,5,19,2,-3,5] 
> foldr max 0 xs 
19 

> foldr1 max xs 
19 

Und wenn ich schreibe (ich weiß, ist der Anfangswert hier falsch für eine generische maximale Funktion ...):

> let maximum' = foldr max 0 
> maximum' xs 
19 

Aber wenn ich schreibe:

> let maximum2' = foldr1 max 
> maximum2' xs 

die Antwort:

<interactive>:61:11: 
    Couldn't match expected type `()' with actual type `Integer' 
    Expected type: [()] 
     Actual type: [Integer] 
    In the first argument of maximum2', namely `xs' 
    In the expression: maximum2' xs 

Ich bin neu in Haskell. Was mache ich falsch? (Kann die Fehlermeldung nicht entschlüsseln ...) Wie funktioniert foldr1 mit max? Vielen Dank.

EDIT (NACH ANTWORT ACCEPTING):

nur einige weitere Beispiele für die säumige Regeln Wirkung zu zeigen (die Antwort erklärt auch diese):

Beispiel 1:

> let max' = max 
> :t max 
max :: Ord a => a -> a -> a 

> :t max' 
max' ::() ->() ->() 

Beispiel 2:

+7

Der gefürchtete Monomorphie Einschränkung sehen. – augustss

+1

komisch genug ': t foldr1 max' ergibt' Ord a => [a] -> a' und 'let maximum 'l = foldr1 max l' funktioniert wie erwartet – soulcheck

+3

@augustss fehlender Link zu [Monomorphie-Einschränkung] (http://www.haskell.org/haskellwiki/Monomorphism_restriction) – soulcheck

Antwort

13

Das Problem ist mit dem Polymorphismus der Typen zu tun und GHCi säumig. Die Art der max ist polymorph:

> :t max 
max :: Ord a => a -> a -> a 

Im Fall von maximum' kann der Compiler, dass a ist eine Art von Zahl und GHCi defaults die Zahl auf Integer:

> :t maximum' 
maximum' :: [Integer] -> Integer 

Im Fall von maximum2' hat es wenige Hinweise und Vorgaben a auf den Gerätetyp:

> :t maximum2' 
maximum2' :: [()] ->() 

Wenn Sie provid e eine Art Unterschrift, ist alles gut:

> let maximum3' :: Ord a => [a] -> a ; maximum3' = foldr1 max 
> :t maximum3' 
maximum3' :: Ord a => [a] -> a 

Ich denke GHCi die säumige Regeln gibt es bestimmte andere Fälle zu machen, wo die Typen leichter weggelassen werden - http://www.haskell.org/ghc/docs/7.6.2/html/users_guide/interactive-evaluation.html#id484837

+0

Wow! Sehr hilfreiche Antwort, danke! Und der Link ist auch sehr nützlich! – TFuto