What characters are permitted for Haskell operators?

前端 未结 3 991
傲寒
傲寒 2020-11-30 20:56

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

3条回答
  •  不知归路
    2020-11-30 21:44

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

    a | b means a or b and

    a means a except b

    special    ->   ( | ) | , | ; | [ | ] | `| { | } 
    symbol     ->   ascSymbol | uniSymbol
    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 | :})
    consym     -> (: {symbol | :})
    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.

提交回复
热议问题