2013-09-06 12 views
9

Jeśli piszę:foldr vs użytkowania foldr1 w Haskell

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

> foldr1 max xs 
19 

A jeśli piszę (wiem, wartość początkowa jest nieprawidłowy tutaj ogólnej maksymalnej funkcji ...):

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

Ale jeśli piszę:

> let maximum2' = foldr1 max 
> maximum2' xs 

odpowiedź brzmi:

<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 

Jestem nowy w Haskell. Co ja robię źle? (Nie można odszyfrować komunikatu o błędzie ...) Jak korzystać z foldr1 z max? Dzięki.

EDIT (po zaakceptowaniu odpowiedź):

Wystarczy pokazać jeszcze kilka przykładów Efekt rules zalegających (odpowiedź wyjaśnia nich zbyt):

Przykład 1:

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

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

Przykład 2:

> let plus = (+) 
> :t (+) 
(+) :: Num a => a -> a -> a 

> :t plus 
plus :: Integer -> Integer -> Integer 
+7

bał ograniczenie monomorfizm. – augustss

+1

wystarczająco funnie: 't foldr1 max' daje' Ord a => [a] -> a' i 'let maximum 'l = foldr1 max l' działa zgodnie z oczekiwaniami – soulcheck

+3

@augustss brakuje linku do [ograniczenia monomorfizmu] (http://www.haskell.org/haskellwiki/Monomorphism_restriction) – soulcheck

Odpowiedz

13

Problem związany jest z polimorfizmem typów i niewykonanie GHCi. Rodzaj max jest polimorficzny:

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

W przypadku maximum', kompilator widzi, że a jest jakiś numer i GHCi domyślnie numerycznych Integer:

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

W przypadku z maximum2' ma mniej wskazówek oraz domyślne a do typu urządzenia:

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

Jeśli dostarczając e podpis typ, wszystko jest dobrze:

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

myślę zasady zalegających GHCi są tam, aby niektóre inne przypadki, w których typy zostały pominięte łatwiejsze - patrz http://www.haskell.org/ghc/docs/7.6.2/html/users_guide/interactive-evaluation.html#id484837

+0

Wow! Bardzo pomocna odpowiedź, dzięki! Link też jest bardzo przydatny! – TFuto

Powiązane problemy