11

Ich habe Probleme zu verstehen, wie Funktion Anwendung mit Curry in Haskell funktioniert. Wenn ich folgende Funktion:Haskell Dollar-Operator-Anwendung

($) :: (a -> b) -> a -> b 

Ich verstehe, dass teilweise diese Funktion anwenden I (a -> b) Funktion ($ s erstes Argument) zur Verfügung stellen muß.

Warum ist es dann möglich, zuerst einen Wert anzuwenden (d. H. Argumente umkehren)?

($ 0) :: Num a => (a -> b) -> b 

Was fehlt mir hier?

Antwort

13

($) ein Operator ist. In Haskell kann jeder Bediener in einem links Abschnitt geschrieben werden (wie (x $)) oder ein rechter Abschnitt (wie ($ x)):

(x $) = (\y -> x $ y) = ($) x 
($ x) = (\y -> y $ x) = flip ($) x 

Beachten Sie, dass die einzige Ausnahme von dieser Regel ist (-), um bequem negative Zahlen schreiben:

\x -> (x-) :: Num a => a -> a -> a -- equivalent to \x -> (-) x 
\x -> (-x) :: Num a => a -> a  -- equivalent to \x -> negate x 

Falls Sie kurz und bündig wollen (\y -> y - x) schreiben, können Sie subtract:

\x -> subtract x :: Num a => a -> a -> a -- equivalent to \x -> flip (-) x 
+0

Danke, das erklärt, warum es so funktioniert. Sind diese Definitionen Sprachmerkmale oder können sie irgendwo in Quellen gefunden werden? – Rumca

+2

@Rumca Nicht wirklich in der Quelle, (x $) und ($ x) sind Abschnitte und eine Beschreibung von ihnen finden Sie in der [2010 Haskell Bericht] (http://www.haskell.org/onlinereport/haskell2010/) im Abschnitt [sections] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5). – Davorak

+0

Die Sprache wird im [Haskell 2010 Report] beschrieben (http://www.haskell.org/onlinereport/haskell2010/). –

4

($ 0)(\x -> x $ 0)(\x -> ($) x 0)

Wenn ($) :: (a -> b) -> a -> b) und wir angewendet zweites Argument wie (\x -> ($) x 0) wir haben :: Num a => (a -> b) -> b

2

Sie verwechseln die Infixnotation eines Operators mit einer Funktion.

> :t (($) (+1)) 
(($) (+1)) :: Num b => b -> b 

Hier sind einige Formen von Ausdrücken mit $, zum besseren Verständnis:

a $ b => ($) ab

($ b) => Flip ($) b => (\ ba -> ($) ab) b => \ a -> ($) ab

(a $) => ($) a => \ b -> ($) ab

+0

-1 Selbst als jemand, der fest versteht, worum es in dieser Frage geht und was die Argumentation ist, finde ich diese Antwort unverständlich. Wie soll jemand, der Haskell nicht kennt, sehr wohl einen Sinn daraus machen? Keine Erklärung für den Unterschied zwischen Operatoren und Funktionen überhaupt. '$ b => flip ($) b => \ a -> ($) a b 'ist nicht einmal gültige Syntax. (Edit: Okay, es wäre -1, wenn ich ein wenig mehr rep. Hätte) –

1

Beachten Sie auch, dass alphanumerische Namen in der Haskell-Syntax von Interpunktionsnamen unterschieden werden.

Eine alphanumerische Funktion foo1 a b ist standardmäßig ein Präfix und wird Infix, wenn Sie Backticks hinzufügen: a `foo` b.

Ein Satznamen Funktion wie $ oder <*> ist Infix standardmäßig und wird Präfix, wenn Sie Klammern ($) oder (<*>) hinzufügen. Dies ist nur Syntax Zucker für den Programmierer mit dem lateinischen Alphabet vertraut; Es ist eine willkürliche, aber hilfreiche Unterscheidung zwischen alphanumerischen Namen und Interpunktionsnamen.

Beide Arten von Funktionen sind nur Funktionen, sie haben nicht die speziellen semantischen Regeln, die wir für "Operatoren" in C++ oder Java haben. Es sind nur die Syntaxregeln um Präfix/Infix und Backticks/Klammern, die sich zwischen Interpunktionsfunktionen und alphanumerisch benannten Funktionen unterscheiden.