Come può (-) apparentemente avere due tipi diversi?


12

In ghci, quando scrivo

:t (-)

per capire il tipo di (-), ritorna

(-) :: Num a => a -> a -> a

Tuttavia, quando scrivo -1haskell restituisce un numero, il che sembra implicare che (-)sia di tipo Num a => a -> a. Come possono (-)apparentemente avere due tipi diversi?

Risposte:


15

Questa è stata una decisione di progettazione nella lingua. -1è un numero, ma il suo utilizzo in questo contesto non(-) è correlato alla funzione . (Come menziona Ackdari nella loro risposta, questo utilizzo è correlato alla funzione negate.) Ci sono un paio di compromessi che consentono a questo di funzionare:

  1. Non puoi prendere una fetta corretta (-)dell'operatore. Come soluzione alternativa, Haskell fornisce la subtractfunzione.

  2. Non è possibile scrivere un numero intero negativo senza parentesi a meno che non sia all'inizio di un compito (ad es. Direttamente dopo =o ->). Questo produce un errore di analisi:

    let x = 8 * -1

    Invece, dovrebbe essere scritto come

    let x = 8 * (-1)

    Tuttavia, questo va bene:

    let x = -1 * 8

Questi sono stati considerati un compromesso ragionevole per i progettisti della lingua.


8

La risposta è già stata decifrata nel wiki di haskell , afferma

Il meno unario è lo zucchero sintattico per la funzione Preludio negate

quindi la funzione (-)è sempre la a - bfunzione e se scrivi il codice come let x = -yil compilatore lo tradurrà let x = negate y.


7

Unus meno è speciale in Haskell. Come indicato nella sezione 3.4 della relazione :

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


2
Le risposte a una frase sono scoraggiate su SO, così come i collegamenti senza un riepilogo del loro contenuto, poiché possono essere interrotti.
Andrew Ray,

Come posso supporre che anche i collegamenti a report / standard siano fortemente pessimizzati rispetto ai wiki / tutorial / video di YouTube?
bipll,

@bipll Sì. Il problema con le risposte di solo collegamento non è la qualità della destinazione del collegamento, ma piuttosto il rischio di marciume del collegamento. Se hai copiato nella relativa sezione del rapporto, la tua risposta andrebbe bene.
Joseph Sible: reintegrare Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.