F#规范在语法中进行了以下定义(第A.1.4.1节):
ident-char :
letter-char
digit-char
connecting-char
combining-char
formatting-char
'
_
将connecting-char
定义为
connecting-char : '\Pc'
我相信这意味着connecting-char
是满足
c
System.Globalization.CharUnicodeInfo.GetUnicodeCategory(c) = UnicodeCategory. ConnectorPunctuation
当您使用_
进行测试时,您会得到:
> System.Globalization.CharUnicodeInfo.GetUnicodeCategory('_');;
val it : System.Globalization.UnicodeCategory = ConnectorPunctuation
我认为这意味着_
是有效的connecting-char
。这提出了一个问题,即为什么_
存在特殊情况。
在实际的编译器源代码中,_
(来自https://github.com/fsharp/fsharp/blob/master/src/fsharp/lex.fsl),
let ident_char =
letter
| connecting_char
| combining_char
| formatting_char
| digit
| ['\'']
问题是 - 为什么F#规范在ident-char中有_
的条目?
答案 0 :(得分:1)
我希望这可能是出于历史原因(继承自F#在SML中的根源)或明确包含下划线(如典型标识符规则所预期的那样:下划线或字母后跟零或更多下划线或alpha -numeric)。
(但这是推测性的,真正回答为什么不问F#团队?)