haskell运营商允许使用哪些字符?

时间:2012-05-11 08:43:22

标签: haskell syntax operators

是否有某个允许字符的完整列表,或者确定标识符与运算符之间可以使用的规则?

3 个答案:

答案 0 :(得分:56)

haskell report开始,这是允许符号的语法:

a | b表示a or b

a<b>表示a except b

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

因此,除了special | _ | : | " | '中保留的符号外,符号是ascii符号或unicode符号。

因此无法使用以下内容:| , ; [ ] ` { } _ : " '

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

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

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

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

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

     

除了前缀否定的特殊语法之外,所有运算符都是   中缀,虽然每个中缀运算符都可以在一个部分中使用   部分应用的运算符(参见第3.5节)。所有的标准   中缀运算符只是预定义的符号,可能会反弹。

答案 1 :(得分:28)

来自Haskell 2010 Report §2.4

  

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

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

答案 2 :(得分:22)