Wie kann (-) scheinbar zwei verschiedene Typen haben?

12

In ghci, wenn ich tippe

:t (-)

Um den Typ von herauszufinden (-), wird zurückgegeben

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

Wenn ich jedoch schreibe, gibt -1haskell eine Zahl zurück, was zu bedeuten scheint, dass dies (-)vom Typ ist Num a => a -> a. Wie kann es (-)scheinbar zwei verschiedene Typen geben?

TippFehler
quelle

Antworten:

15

Dies war eine Designentscheidung in der Sprache. -1ist eine Zahl, aber ihre Verwendung in diesem Zusammenhang hängt nicht mit der Funktion zusammen(-) . (Wie Ackdari in seiner Antwort erwähnt, hängt diese Verwendung mit der Funktion zusammen negate.) Es gibt einige Kompromisse, die dies ermöglichen:

  1. Sie können kein rechtes Stück des (-)Operators nehmen. Als Problemumgehung bietet Haskell die subtractFunktion.

  2. Sie können keine negative Ganzzahl ohne Klammern schreiben, es sei denn, sie steht am Anfang einer Zuweisung (z. B. direkt nach =oder ->). Dies erzeugt einen Analysefehler:

    let x = 8 * -1

    Stattdessen sollte es geschrieben werden als

    let x = 8 * (-1)

    Dies ist jedoch in Ordnung:

    let x = -1 * 8

Dies wurde als angemessener Kompromiss für die Designer der Sprache angesehen.

Andrew Ray
quelle
8

Die Antwort ist bereits im Haskell-Wiki beschrieben , heißt es

Das unäre Minus ist syntaktischer Zucker für die Prelude-Funktion negate

Die Funktion (-)ist also immer die a - bFunktion, und wenn Sie Code schreiben, wie ihn let x = -yder Compiler übersetzt let x = negate y.

Ackdari
quelle
7

Unäres Minus ist in Haskell etwas Besonderes. Wie in Abschnitt 3.4 des Berichts angegeben :

Das spezielle Formular bezeichnet die Präfixnegation, den einzigen Präfixoperator in Haskell, und ist die Syntax für . Der binäre Operator bezieht sich nicht unbedingt auf die Definition von im Präludium; Es kann vom Modulsystem zurückgebunden werden. Unary bezieht sich jedoch immer auf die im Prelude definierte Funktion. Es gibt keinen Zusammenhang zwischen der lokalen Bedeutung des Operators und der unären Negation.-enegate (e)---negate-

bipll
quelle
2
Antworten mit einem Satz werden auf SO nicht empfohlen, ebenso wie Links ohne Zusammenfassung ihres Inhalts, da sie beschädigt werden können.
Andrew Ray
Wie kann ich davon ausgehen, dass Links zu Berichten / Standards im Vergleich zu Wikis / Tutorials / Youtube-Videos ebenfalls stark pessimiert sind?
Bipll
@bipll Ja. Das Problem mit Nur-Link-Antworten ist nicht die Qualität des Link-Ziels, sondern das Risiko von Link-Rot. Wenn Sie in den entsprechenden Abschnitt des Berichts kopieren, ist Ihre Antwort in Ordnung.
Joseph Sible-Reinstate Monica