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:
Der gefürchtete Monomorphie Einschränkung sehen. – augustss
komisch genug ': t foldr1 max' ergibt' Ord a => [a] -> a' und 'let maximum 'l = foldr1 max l' funktioniert wie erwartet – soulcheck
@augustss fehlender Link zu [Monomorphie-Einschränkung] (http://www.haskell.org/haskellwiki/Monomorphism_restriction) – soulcheck