【问题标题】:What's sense has Discriminated unions does not infer (and create) the type?有区别的联合不推断(和创建)类型有什么意义?
【发布时间】:2017-10-04 21:10:38
【问题描述】:

我有两种动物:

type Person(name) =
    member this.Name: string = name
    
type Cat(age) =
    member this.Age: int = age

我“加入”这些类型:

type Animal =
| Person of Person
| Cat of Cat
| Dog

当我尝试创建 Person 实例时:

let person = new Person("Alex")

我得到错误:

联合案例 Animal.Person: Person -> Animal

'string' 类型与'Person' 类型不兼容

问题:

Person 是一个带有构造函数的

Animal.Person 类型应该是Person 的实例。那么,有什么问题呢?

编辑: Visual Studio for Windows 不显示错误,但如果添加更多源代码,则会收到错误“'Person' does not match type 'Animal'”:

[<EntryPoint>]
let main argv =
    let person = new Person("Alex")

    person
    |> KnowAnimal
    |> printfn "%O"

【问题讨论】:

  • 那么你的问题是什么。它不起作用的原因与它在您之前的问题中不起作用的原因相同。同样的解决方案也适用。请澄清。
  • @Gustavo "How" 在我之前的问题中,现在是 "why"。 Person 是一个带有构造函数的类,Animal.Person 类型应该是 Person 的一个实例。那么,有什么问题呢?
  • 您确定您显示的代码正确吗?运行您的代码时,我没有收到任何错误消息 - 它运行良好。
  • let person: Animal = Person(new Person("Alex"))
  • 对,它类型Person,而不是is。同样的区别:type Value = Number of int | String of stringNumber 不是 int,它有一个 int。

标签: f#


【解决方案1】:

Animal.Person 类型应该是 Person 的一个实例。那么,有什么问题呢?

首先Animal.Person不是类型,Person是类型,Animal是类型。 Animal.PersonAnimal 类型的一个案例,它采用 Person 作为参数。也就是说,它充当Person -&gt; Animal 类型的函数,因此它接受Person 类型的值并返回Animal 类型的值。这两种类型之间没有子类型关系。

所以personPerson 类型的值,Person personAnimal 类型的值,因为Person 接受Person 并返回Animal

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2013-12-27
    • 2021-02-14
    • 2013-07-29
    • 2011-02-14
    相关资源
    最近更新 更多