Welche Zeichen sind für Haskell-Operatoren zulässig?

70

Gibt es irgendwo eine vollständige Liste der zulässigen Zeichen oder eine Regel, die bestimmt, was in einem Bezeichner gegenüber einem Operator verwendet werden kann?

Peter Hall
quelle

Antworten:

64

Im Haskell-Bericht ist dies die Syntax für zulässige Symbole:

a | bbedeutet a or bund

a<b> meint a except b

special    ->   ( | ) | , | ; | [ | ] | `| { | } 
symbol     ->   ascSymbol | uniSymbol<special | _ | : | " | '>
ascSymbol  ->   ! | # | $ | % | & | * | + | . | / | < | = | > | ? | @
                \ | ^ | | | - | ~
uniSymbol  ->   any Unicode symbol or punctuation 

Symbole sind also ASCII-Symbole oder Unicode-Symbole, mit Ausnahme derjenigen in special | _ | : | " | ', die reserviert sind.

Das heißt, die folgenden Zeichen können nicht verwendet werden: | , ; [ ] ` { } _ : " '

In einigen Absätzen enthält der Bericht die vollständige Definition für Haskell-Operatoren:

varsym     -> ( symbol {symbol | :})<reservedop | dashes>
consym     -> (: {symbol | :})<reservedop>
reservedop -> .. | : | :: | = | \ | | | <- | -> | @ | ~ | =>

Operatorsymbole bestehen aus einem oder mehreren Symbolzeichen, wie oben definiert, und werden lexikalisch in zwei Namespaces unterschieden (Abschnitt 1.4):

  • Ein Operatorsymbol, das mit einem Doppelpunkt beginnt, ist ein Konstruktor.
  • Ein Operatorsymbol, das mit einem anderen Zeichen beginnt, ist eine gewöhnliche Kennung.

Beachten Sie, dass ein Doppelpunkt ":" ausschließlich für die Verwendung als Haskell-Listenkonstruktor reserviert ist. Dies macht seine Behandlung einheitlich mit anderen Teilen der Listensyntax, wie "[]" und "[a, b]".

Mit Ausnahme der speziellen Syntax für die Präfixnegation sind alle Operatoren Infix-Operatoren, obwohl jeder Infix-Operator in einem Abschnitt verwendet werden kann, um teilweise angewendete Operatoren zu erhalten (siehe Abschnitt 3.5). Alle Standard-Infix-Operatoren sind nur vordefinierte Symbole und können zurückgebunden werden.

Riccardo T.
quelle
10
Sollte heutzutage wahrscheinlich den haskell2010-Bericht anstelle des haskell98-Berichts zitieren (obwohl sie in diesem Fall, soweit ich sehen kann, dasselbe sagen).
Ben Millwood
FWIW, tryhaskell.org gibt derzeit einen lexikalischen Fehler für den Versuch, eines der mathematischen let a ⟬ b = 1
Klammersymbole
32

Aus dem Haskell 2010-Bericht §2.4 :

Operatorsymbole bestehen aus einem oder mehreren Symbolzeichen ...

§2.2 definiert Symbolzeichen als eines von !#$%&*+./<=>?@\^|-~:oder "ein beliebiges [Nicht-ASCII] Unicode-Symbol oder eine Interpunktion".

ANMERKUNG : Benutzerdefinierte Operatoren können nicht mit einem :as beginnen und den Sprachbericht zitieren : " Ein Operatorsymbol, das mit einem Doppelpunkt beginnt, ist ein Konstruktor. "

dave4420
quelle
2
Interessant, dass Sie beliebigen Unicode verwenden können. Also wären zum Beispiel λ oder ⊗ gültige Haskell-Operatoren?
Chris Taylor
14
Nein, λist ein Unicode-Buchstabe, kein Unicode-Symbol oder ein Unicode-Interpunktionszeichen. Sie können es also nicht als Teil eines Operatornamens verwenden (aber Sie können es als Teil eines normalen Bezeichners verwenden).
Dave4420
2
Ich gehe davon aus, dass Sie als Haskell-Operator arbeiten können, aber ich weiß es nicht genau.
Dave4420
7
Sie können. Es generalCategoryist MathSymbol(nur um sicherzugehen, dass ich tatsächlich einen Operator (⊗)in ghci definiert habe und es akzeptiert wurde).
Daniel Fischer
26

Was ich suchte, war die vollständige Liste der Charaktere. Basierend auf den anderen Antworten ist die vollständige Liste;

Unicode-Interpunktion:

Unicode-Symbole:

Aber ohne die folgenden Zeichen mit besonderer Bedeutung in Haskell:

(),;[]`{}_:"'

A :ist nur als erstes Zeichen des Operators zulässig und bezeichnet einen Konstruktor (siehe Ein mit einem Doppelpunkt beginnendes Operatorsymbol ist ein Konstruktor ).

Peter Hall
quelle
Das ist absolut verrückt! Es ist großartig, dass die Verwendung von Unicode-Symbolen möglich ist, aber leider sind sie auf aktuellen Tastaturen normalerweise sehr schwer zu tippen.
Qqwy
5
@Qqwy - Haskell wurde für die Verwendung in einer literarischen Programmierumgebung entwickelt. Sie könnten ein Dokument erstellen, das für den Satz mit Codefragmenten ausgelegt ist, und diese Codefragmente tatsächlich in Ihrem Quelldokument ausführbar machen. Die Möglichkeit, Unicode-Operatoren zu definieren, ist für diesen Zweck von unschätzbarem Wert.
Jules