2015-02-01 6 views
5

Sono sicuramente un principiante Haskell. Per esplorare la pigrizia, ho creato una funzione in ghci che restituisce il secondo argomento:Perché una semplice funzione di Haskell rifiuta un argomento frazionario espresso come rapporto?

Prelude> let latter x y = y 
latter :: t -> t1 -> t1 

Sono in grado di chiamare con argomenti di tipo Char, [Char], Num, Floating e Fractional (espressi come decimali):

Prelude> latter 'x' 'y' 
'y' 
it :: Char 

Prelude> latter "foo" "bar" 
"bar" 
it :: [Char] 

Prelude> latter 1 2 
2 
it :: Num t1 => t1 

Prelude> latter pi pi 
3.141592653589793 
it :: Floating t1 => t1 

Prelude> latter 0.5 0.7 
0.7 
it :: Fractional t1 => t1 

Perché ottengo un errore di orribile (e cosa significa) quando cerco di applicare latter ad un Fractional espresso come rapporto:

Prelude> 1/2 
0.5 
it :: Fractional a => a 

Prelude> latter 1/2 1/2 

<interactive>:62:1: 
    Could not deduce (Num (a0 -> t1 -> t1)) 
     arising from the ambiguity check for ‘it’ 
    from the context (Num (a -> t1 -> t1), 
         Num a, 
         Fractional (t1 -> t1)) 
     bound by the inferred type for ‘it’: 
       (Num (a -> t1 -> t1), Num a, Fractional (t1 -> t1)) => t1 -> t1 
     at <interactive>:62:1-14 
    The type variable ‘a0’ is ambiguous 
    When checking that ‘it’ 
     has the inferred type ‘forall t1 a. 
          (Num (a -> t1 -> t1), Num a, Fractional (t1 -> t1)) => 
          t1 -> t1’ 
    Probable cause: the inferred type is ambiguous 
+4

Hai bisogno di parenti: 'ultimi (1/2) (1/2)'. – Jubobs

+0

D'oh! Grazie. –

risposta

17

L'applicazione di funzione in Haskell si lega più strettamente di qualsiasi altra cosa. Così

latter 1/2 1/2 

viene letto come

((latter 1)/(2 1))/2 

Applicando 2-1 non è un'idea così caldo, e dal momento che latter accetta due argomenti, latter 1 è in realtà una funzione. Dividere una funzione per qualcosa non è una buona idea. Puoi correggere tutti questi problemi usando alcune parentesi:

latter (1/2) (1/2) 
+0

Grazie mille per il vostro aiuto. –