Syntax F#区分并集语法澄清
我正在阅读,在某一点上(第93页),为Syntax F#区分并集语法澄清,syntax,f#,discriminated-union,Syntax,F#,Discriminated Union,我正在阅读,在某一点上(第93页),为列表引入了以下语法: type 'T list = | ([]) | (::) of 'T * 'T list 虽然我在概念上理解这里发生的事情,但我不理解语法。显然,你可以把[]或:放在括号之间,它们表示一些特殊的意思 不允许使用其他符号,例如(++)或(| |)。这是怎么回事 另一件事是(:)的“操作员”性质。假设我有以下(奇怪的)类型: 现在我可以说: let x: X<string> = Some ("", None)
列表
引入了以下语法:
type 'T list =
| ([])
| (::) of 'T * 'T list
虽然我在概念上理解这里发生的事情,但我不理解语法。显然,你可以把[]
或:
放在括号之间,它们表示一些特殊的意思
不允许使用其他符号,例如(++)
或(| |)
。这是怎么回事
另一件事是(:)
的“操作员”性质。假设我有以下(奇怪的)类型:
现在我可以说:
let x: X<string> = Some ("", None)
设x:x=Some(“,无”)
但这些是不允许的:
let x: X<string> = :: ("", None)
let x: X<string> = (::) ("", None)
设x:x=::(“”,无)
设x:x=(:)(“”,无)
因此,(::)
实际上与某些
完全不同,尽管两者都是有区别的联合体中的情况。理论上(参见第8.5节)说联合体的大小写标识符必须是以大写字母开头的字母数字序列
然而,这种定义列表cons的方法是一种ML惯用的方法。如果我们被迫写Cons(x,Cons(y,Cons(z,Empty))
而不是x::y::z:[]
,街道上就会发生骚乱
因此,只有这两个标识符例外-([])
和(:)
。您可以使用这些,但只能使用这两个。除这两个名称外,只允许使用大写字母数字名称
但是,您可以使用以下有趣的名称定义独立函数:
let (++) a b = a * b
这些函数通常称为“运算符”,可以通过中缀符号调用:
let x = 5 ++ 6 // x = 30
与只支持前缀表示法的常规函数相反,即f5 6
关于运算符中允许哪些字符,哪些只能是一元字符,哪些只能是二进制字符,哪些可以是二元字符,哪些可以是二元字符,以及它们如何定义结果运算符的优先级,还有一组非常复杂的规则。完整参考请参见规范第4.1节。当您在括号之间放置一些符号时,它们可能表示运算符
([])
和(:)
是F#语言中预定义的运算符,表示空列表和列表构造函数(由第一个元素和列表的其余部分组成)。关于操作符的更多信息:我知道:
和[]
是操作符,但是为什么在联合案例中可以有操作符呢?谢谢,这解释了很多!奇怪的是,这不在规范中。实际上还有一件事我不明白,那就是([])
和(:)
的“运算符”性质。例如,如果您尝试(| |)
,我会遇到一个错误:尝试将其作为运算符名称进行分析,但失败。在原始问题中添加了一个附加问题,因为我仍然不完全理解。这是因为[]
和:
都不是有效的运算符名称。将它们用作联合用例有一个特殊的例外,但将它们用作运算符则没有这样的例外。
let x = 5 ++ 6 // x = 30