74

某处是否有完整的允许字符列表,或确定标识符与运算符中可以使用什么的规则?

4

3 回答 3

66

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 节)。所有标准中缀运算符都只是预定义的符号,可能会被反弹。

于 2012-05-11T09:08:01.177 回答
33

来自Haskell 2010 报告§2.4

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

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

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

于 2012-05-11T08:53:49.547 回答