gpt4 book ai didi

syntax - F# 区分联合语法说明

转载 作者:行者123 更新时间:2023-12-03 12:59:45 25 4
gpt4 key购买 nike

我在看 Expert F# 4.0并且在某些时候(第 93 页)为 list 引入了以下语法:

type 'T list =
| ([])
| (::) of 'T * 'T list

虽然我从概念上理解这里发生了什么,但我不理解语法。显然你可以把 []::在括号之间,它们意味着一些特殊的东西。

不允许使用其他符号,例如 (++)(||) .那么这里发生了什么?

另一件事是 (::) 的“运算符”性质。 .假设我有以下(奇怪的)类型:
type 'T X =
| None
| Some of 'T * 'T X
| (::) of 'T * 'T X

现在我可以说:
let x: X<string> = Some ("", None)

但这些是不允许的:
let x: X<string> = :: ("", None)
let x: X<string> = (::) ("", None)

所以 (::)实际上与 Some 完全不同,尽管两者都是受歧视联合中的情况。

最佳答案

理论上,F# spec (参见第 8.5 节)说联合大小写标识符必须是以大写字母开头的字母数字序列。

但是,这种定义列表 cons 的方式是 ML 惯用的做法。逼着写Cons (x, Cons(y, Cons (z, Empty)))上街会闹而不是 x :: y :: z :: [] .

所以只对这两个标识符做了一个异常(exception) - ([])(::) .您可以使用这些,但只能使用这两个。除了这两个,只允许大写字母数字名称。

但是,您可以使用这些有趣的名称定义独立函数:

let (++) a b = a * b

这些函数通常称为“运算符”,可以通过中缀符号调用:
let x = 5 ++ 6   // x = 30

与仅支持前缀符号的常规函数​​相反 - 即 f 5 6 .

关于运算符中允许哪些字符,哪些只能是一元的,哪些只能是二元的,哪些可以是两者,以及它们如何定义结果运算符的优先级,有一组单独的相当复杂的规则。请参阅规范的第 4.1 节或 here供完整引用。

关于syntax - F# 区分联合语法说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40270879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com