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# 规范有_
in ident-char 的条目?