Haskell运算符可以使用哪些字符?


70

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

Answers:


64

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]”)一致。

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


10
这些天应该应该引用haskell2010报告而不是haskell98报告(据我所知,尽管在这种情况下,他们说的是同一句话)。
本·米尔伍德

FWIW,tryhaskell.org目前给出了一个词法错误试图数学包围的符号使用一个,例如let a ⟬ b = 1
风铃草

32

根据Haskell 2010报告§2.4

操作员符号由一个或多个符号字符组成。

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

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


2
有趣的是,您可以使用任意Unicode。因此,例如,λ或⊗将是有效的Haskell运算符?
克里斯·泰勒

14
不,λ是Unicode字母,不是Unicode符号或Unicode标点字符。因此,不能将其用作运算符名称的一部分(但可以将其用作普通标识符的一部分)。
dave4420

2
我希望您可以用作Haskell运算符,但我不确定。
dave4420

7
您可以。它generalCategoryMathSymbol(为了确保,我实际上(⊗)在ghci中定义了一个运算符,并且它被接受了)。
丹尼尔·菲舍尔

26

太疯狂了!可以使用任何Unicode符号都很棒,但是不幸的是,它们通常很难在当前键盘上键入。
2016年

5
@Qqwy-Haskell设计用于识字编程环境。您可能会生成一个设计用于使用代码片段进行排版的文档,并使这些代码片段实际在您的源文档中可执行。为此,定义unicode运算符的能力非常宝贵。
Jules
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.