2013-02-13 14 views
7

Per gli avvoltoi che potrebbero dire "Cerca nel tuo libro di testo" o "Hoogle it", l'ho fatto.Che cosa significa (== ""), in Haskell?

mi sono imbattuto la dichiarazione

recipe = (== "000001")

Sembra una sorta di booleana per me, ma non sono sicuro. Ho provato a testarlo in modi diversi in GHCi, ma non sono riuscito a capire nulla che funzioni. qualcuno può spiegare che cosa significa, e questa domanda sarà di conseguenza la prossima volta che qualcuno Googles Haskell (==" ")

+3

'questa domanda sarà un risultato la prossima volta che qualcuno Google "Haskell (=="' No, non lo farà.Google ignora le punteggiature, googling per "Haskell (==" è lo stesso di googling di "Haskell" .Questo spiega anche perché non ti è stato utile durante la ricerca di questo: – sepp2k

+0

sta solo controllando l'uguaglianza di una stringa. > ricetta "000001" e restituirà True –

+0

@ sepp2k È interessante ... puoi spiegare come farei a Google una cosa simile? – CodyBugstein

risposta

11

È possibile utilizzare GHCI per capirlo.

In GHCI, inserire let recipe = (== "000001"). Ora possiamo vedere come funziona. Prova :t recipe per vedere di che tipo si tratta. Questo restituisce recipe :: [Char] -> Bool, quindi sembra che questa sia una funzione che prende un elenco di Char s (a String) e restituisce un Bool.

Se lo verificate, troverete che restituisce False per qualsiasi input eccetto "000001".

Poiché == è un operatore, è possibile applicarlo parzialmente a un argomento e restituirà una funzione che accetta l'altro argomento e restituisce il risultato. Quindi, qui == "000001" restituisce una funzione che accetta un argomento per riempire l'altro lato di == e restituisce il risultato.


Modifica: Se la definizione fosse recipe = ((==) "000001") questa spiegazione sarebbe corretta.

Per capire questo, è necessario cercare partial application. Il tipo della funzione == è a -> a -> Bool, una funzione che accetta due argomenti dello stesso tipo e restituisce uno Bool.

Ma è anche una funzione di tipo a -> (a -> Bool), che accetta un argomento di tipo a e restituisce una nuova funzione con la firma a -> Bool. Questo è quello che sta succedendo qui. Abbiamo fornito un argomento a ==, quindi ha restituito una nuova funzione di tipo a -> Bool o [Char] -> Bool in questo caso particolare.

+0

Non è in corso. Bene, non direttamente –

+3

No, non è quello che sta succedendo qui. '(== pippo)' corregge l'argomento * secondo * di '==', non il primo. Quindi non si tratta solo di chiamare '==' con un argomento. – sepp2k

+0

Oh sì, mio ​​male, lo aggiusterò. –

7

Per operatore binario @ l'espressione (@ x) significherebbe (\y -> y @ x).

Nel tuo caso sarà (\y -> y == "000001") ie. funzione che accetta String e dice se è uguale a "000001".

5

(== arg) o (arg ==) è una sezione operatore (funziona anche per altri operatori - non solo ==). Quello che fa è applicare parzialmente l'operatore all'operando dato. Quindi (== "foo") è lo stesso di \x -> x == "foo".

28

È un section. È equivalente a recipe = \x -> x == "000001" (che a sua volta è lo stesso di recipe x = x == "000001").