gpt4 book ai didi

f# - 单例DU中的 `|`是什么意思?

转载 作者:行者123 更新时间:2023-12-05 01:51:18 25 4
gpt4 key购买 nike

考虑这个 DU:

type Foo = | Foo

我的理解是这是等价的:

type Foo = Foo

但是,如果我们引入泛型,它们就不是:

// Does not compile
type Bar<'t> = Bar
// Compiles
type Bar<'t> = | Bar

这是怎么回事?


更多发现:

// Works
type Bar<'t> = Bar of 't
// Works
type Bar<'t> = | Bar of 't

最佳答案

我认为这里有两个有趣的案例。第一个是:

type Foo = Foo

起初这看起来像是一个自引用类型别名,但这是不允许的,因此编译器将其接受为有效的 DU。这是正确但微妙的行为。

第二个有趣的案例是:

type Bar<'t> = Bar   // Error: The type 'Bar<_>' expects 1 type argument(s) but is given 0

这乍一看也像是一个自引用类型别名,但类型参数的数量不对。由于引用无效,编译器在它有机会意识到它实际上正在查看有效的 DU 定义之前发出错误。我认为有人可以合理地争辩说这是编译器中的错误,我建议将其作为问题提交给 F# 编译器团队。预期的行为是这是一个有效的 DU,就像 type Foo = Footype Bar<'t> = | Bar .

另请注意,以下内容(正确地)是不允许的:

type Bar<'t> = Bar<'t>   // Error: This type definition involves an immediate cyclic reference through an abbreviation

compiler source-code有以下要说的:

// This unfortunate case deals with "type x = A" 
// In F# this only defines a new type if A is not in scope
// as a type constructor, or if the form type A = A is used.
// "type x = | A" can always be used instead.

关于f# - 单例DU中的 `|`是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72373967/

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