2015-03-04 14 views
6

In base alla posizione, le applicazioni parziali in Haskell ottengono la risposta corretta.Perché `-` (meno) funziona per le sezioni operatore?

Prelude> (/2) 10 
5.0 
Prelude> (2/) 10 
0.2 
Prelude> (+3) 10 
13 
Prelude> (3+) 10 
13 

Tuttavia, per - operatore, ho ottenuto un errore con (-3) come Haskell (sembra) lo interpreta come un valore -3 dell'applicazione non parziale.

Prelude> (-3) 10 

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

come risolvere questo problema per ottenere 7 in questo esempio?

risposta

15

Utilizzare subtract. - è l'unico operatore in Haskell, che si verifica sia in un prefisso e binario variante infisso:

let a = -3  -- prefix variant 
let b = (-3) -- also prefix variant! 
let c = 4 - 3 -- binary variant 

Pertanto, si dovrebbe usare (subtract 3) 10. Vedere anche section 3.4 in the Haskell 2010 report (sottolineatura mia):

La forma speciale -e denota prefisso negativo, l'operatore unico prefisso Haskell, ed è sintassi negate (e). L'operatore binario - non fa necessariamente riferimento alla definizione di - nel Preludio; potrebbe essere rimbalzato dal sistema del modulo. Tuttavia, l'unario - farà sempre riferimento alla funzione negate definita nel Preludio. Non esiste alcun collegamento tra il significato locale dell'operatore - e la negazione unario.

La negazione del prefisso ha la stessa precedenza dell'operatore infisso - definito nel Preludio (vedere la Tabella 4.1). Poiché l'analisi e1-e2 viene analizzata come applicazione infissa dell'operatore binario -, è necessario scrivere e1(-e2) per l'analisi alternativa. Allo stesso modo, (-) è la sintassi per (\ x y -> x-y), come con qualsiasi operatore infisso, e non indica (\ x -> -x) - uno deve utilizzare negate per quello.

E section 3.5 conclude (di nuovo, enfasi mia):

Poiché - è trattata specialmente nella grammatica, (- exp) non è una sezione, ma un'applicazione del prefisso negativo, come descritto nella sezione precedente . Tuttavia, esiste una funzione subtract definita nel Preludio tale che (subtract exp) è equivalente alla sezione non consentita. L'espressione (+ (- exp)) può avere lo stesso scopo.

Problemi correlati