Syntax F#区分并集语法澄清

Syntax F#区分并集语法澄清,syntax,f#,discriminated-union,Syntax,F#,Discriminated Union,我正在阅读,在某一点上(第93页),为列表引入了以下语法: type 'T list = | ([]) | (::) of 'T * 'T list 虽然我在概念上理解这里发生的事情,但我不理解语法。显然,你可以把[]或:放在括号之间,它们表示一些特殊的意思 不允许使用其他符号,例如(++)或(| |)。这是怎么回事 另一件事是(:)的“操作员”性质。假设我有以下(奇怪的)类型: 现在我可以说: let x: X<string> = Some ("", None)

我正在阅读,在某一点上(第93页),为
列表
引入了以下语法:

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节或完整参考。

理论上(参见第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#语言中预定义的运算符,表示空列表和列表构造函数(由第一个元素和列表的其余部分组成)。关于运算符的更多信息:我知道
[]
是运算符,但为什么在并集情况下可以有运算符?当您在括号之间放置一些符号时,它们可能表示运算符
([])
(:)
是F#语言中预定义的运算符,表示空列表和列表构造函数(由第一个元素和列表的其余部分组成)。关于操作符的更多信息:我知道
[]
是操作符,但是为什么在联合案例中可以有操作符呢?谢谢,这解释了很多!奇怪的是,这不在规范中。实际上还有一件事我不明白,那就是
([])
(:)
的“运算符”性质。例如,如果您尝试
(| |)
,我会遇到一个错误:尝试将其作为运算符名称进行分析,但失败。在原始问题中添加了一个附加问题,因为我仍然不完全理解。这是因为
[]
都不是有效的运算符名称。将它们用作联合用例有一个特殊的例外,但将它们用作运算符没有这样的例外。谢谢,这解释了很多!奇怪的是,这不在规范中。实际上还有一件事我不明白,那就是
([])
(:)
的“运算符”性质。例如,如果您尝试
(| |)
,我会遇到一个错误:尝试将其作为运算符名称进行分析,但失败。在原始问题中添加了一个附加问题,因为我仍然不完全理解。这是因为
[]
都不是有效的运算符名称。将它们用作联合用例有一个特殊的例外,但将它们用作运算符则没有这样的例外。