Haskell 运算符允许使用哪些字符?

是否有一个允许字符的完整列表,或者一个规则来确定在标识符和操作符中可以使用哪些字符?

16679 次浏览

来自 Haskell 2010年报告2.4:

运算符符号 由一个或多个符号字符组成..。

2.2 符号字符定义为 !#$%&*+./<=>?@\^|-~:或“任何[非 ascii ] Unicode 符号或标点符号”之一。

注意 : 用户定义的操作符不能以 :开头,引用 语言报告,“ 以冒号开头的运算符符号是构造函数。

Haskell 报告中,这是允许符号的语法:

a | b的意思是 a or b

a<b>代表 a except b

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

因此,符号是 ASCII 符号或 Unicode 符号,但 special | _ | : | " | '中的符号是保留的。

意味着不能使用以下字符: ( ) | , ; [ ] ` { } _ : " '

下面几段,报告给出了 Haskell 运算符的完整定义:

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

运算符符号由一个或多个符号字符组成,如 定义,并在词法上区分为两个名称空间 (第1.4条) :

  • 以冒号开头的运算符符号是构造函数。
  • 以任何其他字符开头的运算符符号是普通标识符。

注意,冒号“ :”本身仅保留作为 Haskell 列表构造函数; 这使其处理与其他 列表语法的一部分,例如“[]”和“[ a,b ]”。

除了前缀否定的特殊语法之外,所有运算符都是 尽管每个中缀操作符都可以在一个节中使用以产生 部分应用的操作员(见第3.5节) 中缀运算符只是预定义的符号,可能是回弹。