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?

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.


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.


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-


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.