Was bedeutet (== "") in Haskell?

7

Für die Geier, die sagen könnten "Schaut es in eurem Lehrbuch nach" oder "Hoogle es", tat ich es.

Ich stieß auf die Aussage

recipe = (== "000001")

Es sieht für mich wie eine Art Boolean aus, aber ich bin mir nicht sicher. Ich habe versucht, es auf verschiedene Arten in GHCi zu testen, aber ich konnte nichts herausfinden, was funktioniert. Kann jemand erklären, was es bedeutet, und diese Frage wird das nächste Mal sein, wenn jemand Googles Haskell (== "")

    
CodyBugstein 13.02.2013, 23:48
quelle

4 Antworten

11

Sie können GHCI verwenden, um dies herauszufinden.

Geben Sie in GHCI in let recipe = (== "000001") ein. Jetzt können wir sehen, wie es funktioniert. Probieren Sie :t recipe aus, um zu sehen, was der Typ ist. Das gibt recipe :: [Char] -> Bool zurück, also sieht es so aus, als wäre dies eine Funktion, die eine Liste von Char s (a String ) nimmt und eine Bool zurückgibt.

Wenn Sie es testen, werden Sie False für jede Eingabe außer "000001" zurückgeben.

Da == ein Operator ist, können Sie ihn teilweise auf ein Argument anwenden, und es wird eine Funktion zurückgegeben, die das andere Argument übernimmt und das Ergebnis zurückgibt. Also gibt == "000001" eine Funktion zurück, die ein Argument benötigt, um die andere Seite von == zu füllen und das Ergebnis zurückgibt.

Bearbeiten: Wenn die Definition recipe = ((==) "000001") wäre, wäre diese Erklärung richtig.

Um das zu verstehen, sollten Sie eine Teilanwendung nachschlagen. Der Typ der Funktion == ist a -> a -> Bool , eine Funktion, die zwei Argumente des gleichen Typs akzeptiert und eine Bool zurückgibt.

Aber es ist auch eine Funktion vom Typ a -> (a -> Bool) , die ein Argument vom Typ a akzeptiert und eine neue Funktion mit der Signatur a -> Bool zurückgibt. Das passiert hier. Wir haben ein Argument für == angegeben, sodass es in diesem speziellen Fall eine neue Funktion vom Typ a -> Bool oder [Char] -> Bool zurückgegeben hat.

    
Jeff Burka 13.02.2013, 23:55
quelle
28

Es ist ein Abschnitt . Dies entspricht recipe = \x -> x == "000001" (was wiederum mit recipe x = x == "000001" identisch ist).

    
Cat Plus Plus 13.02.2013 23:55
quelle
7

Für den binären Operator @ würde der Ausdruck (@ x) (\y -> y @ x) bedeuten.

In Ihrem Fall ist es (\y -> y == "000001") ie. Funktion, die String übernimmt und sagt, ob es gleich "000001" ist.

    
zch 13.02.2013 23:55
quelle
5

(== arg) oder (arg ==) ist ein Operatorabschnitt (funktioniert auch für andere Operatoren - nicht nur == ). Was es tut, ist, den Operator teilweise auf den gegebenen Operanden anzuwenden. Also (== "foo") ist dasselbe wie \x -> x == "foo" .

    
sepp2k 13.02.2013 23:55
quelle

Tags und Links