2012-05-11 47 views

回答

16
+10

Upvoted,但有一个警告:运算符名称中允许使用':'* *。如果它是第一个字符,那么运算符命名一个构造函数,否则它将函数命名为正常。 – dave4420

+0

我不知道! –

+0

这绝对是疯了!使用任何Unicode符号是可能的,但很不幸,它们通常很难在当前键盘上输入。 – Qqwy

27

Haskell 2010 Report §2.4

从一个或多个符号的字符所形成的符号...

§2.2限定符号字符为任何的!#$%&*+./<=>[email protected]\^|-~:或“任何[非ASCII] Unicode符号或标点符号“。

+2

有趣的是,你可以使用任意的Unicode。那么,例如,λ或⊗是否是有效的Haskell运算符? –

+12

不,“λ”是一个Unicode字母,不是Unicode符号或Unicode标点符号。所以你不能将它用作操作符名称的一部分(但你可以将它用作普通标识符的一部分)。 – dave4420

+2

我希望你可以使用''作为Haskell运算符,但我不确定。 – dave4420

48

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

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

所以,符号是ASCII符号或Unicode符号除了不同于special | _ | : | " | ',其被保留(这里a | b是指“可以是ab“和a<b>表示”可能是a中的所有内容,但b“除外)。 以下几个段落中,报告给出了Haskell的运营商的完整的定义:

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

算符号从一个或多个符号的字符形成的,如以上所定义 ,并且是词法区分为两个命名空间 ( 1.4节):

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

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

除前缀否定的特殊语法外,所有运算符都是 中缀,但每个中缀运算符可用于部分应用的运算符(请参阅第3.5节)。所有标准的 中缀运算符只是预定义的符号,可能会反弹。

+6

这些日子可能应该引用[haskell2010报告](http://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-180002.4)而不是haskell98报告(尽管在这种情况下他们会说同样的事情据我所见)。 –

相关问题