What characters are permitted for Haskell operators?

15,840

Solution 1

What I was looking for was the complete list of characters. Based on the other answers, the full list is;

Unicode Punctuation:

Unicode Symbols:

But excluding the following characters with special meaning in Haskell:

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

A : is only permitted as the first character of the operator, and denotes a constructor (see An operator symbol starting with a colon is a constructor).

Solution 2

From the Haskell report, this is the syntax for allowed symbols:

a | b means a or b and

a<b> means a except b

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

So, symbols are ASCII symbols or Unicode symbols except from those in special | _ | : | " | ', which are reserved.

Meaning the following characters can't be used: ( ) | , ; [ ] ` { } _ : " '

A few paragraphs below, the report gives the complete definition for Haskell operators:

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

Operator symbols are formed from one or more symbol characters, as defined above, and are lexically distinguished into two namespaces (Section 1.4):

  • An operator symbol starting with a colon is a constructor.
  • An operator symbol starting with any other character is an ordinary identifier.

Notice that a colon by itself, ":", is reserved solely for use as the Haskell list constructor; this makes its treatment uniform with other parts of list syntax, such as "[]" and "[a,b]".

Other than the special syntax for prefix negation, all operators are infix, although each infix operator can be used in a section to yield partially applied operators (see Section 3.5). All of the standard infix operators are just predefined symbols and may be rebound.

Solution 3

From the Haskell 2010 Report §2.4:

Operator symbols are formed from one or more symbol characters...

§2.2 defines symbol characters as being any of !#$%&*+./<=>?@\^|-~: or "any [non-ascii] Unicode symbol or punctuation".

NOTE: User-defined operators cannot begin with a : as, quoting the language report, "An operator symbol starting with a colon is a constructor."

Share:
15,840
Peter Hall
Author by

Peter Hall

Updated on July 09, 2022

Comments

  • Peter Hall
    Peter Hall almost 2 years

    Is there a complete list of allowed characters somewhere, or a rule that determines what can be used in an identifier vs an operator?

  • Chris Taylor
    Chris Taylor about 12 years
    Interesting that you can use arbitrary Unicode. So, for instance, λ or ⊗ would be valid Haskell operators?
  • dave4420
    dave4420 about 12 years
    No, λ is a Unicode letter, not a Unicode symbol or a Unicode punctuation character. So you can't use it as part of an operator name (but you can use it as part of an ordinary identifier).
  • dave4420
    dave4420 about 12 years
    I expect you could use as a Haskell operator, but I don't know for sure.
  • Daniel Fischer
    Daniel Fischer about 12 years
    You can. Its generalCategory is MathSymbol (just to make sure, I actually defined an operator (⊗) in ghci, and it was accepted).
  • Ben Millwood
    Ben Millwood about 12 years
    Should probably be citing the haskell2010 report instead of the haskell98 report these days (although in this case they say the same thing, as far as I can see).
  • Qqwy
    Qqwy almost 8 years
    This is absolutely insane! It is great that using any Unicode symbols is possible, but unfortunately they are usually very hard to type on current keyboards.
  • Jules
    Jules about 7 years
    @Qqwy - Haskell is designed for use in a literate programming environment. You could be producing a document designed for typesetting with code fragments, and have those code fragments actually executable in your source document. The ability to define unicode operators is invaluable for that purpose.
  • rampion
    rampion about 5 years
    FWIW, tryhaskell.org currently gives a lexical error for trying to use one of the mathematical bracketing symbols, e.g. let a ⟬ b = 1