什么意义有歧视的工会不推断(和创造)类型?

时间:2017-10-04 21:10:39

标签: f#

我有两种类型的动物:

type Person(name) =
    member this.Name: string = name

type Cat(age) =
    member this.Age: int = age

I"加入"类型:

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

当我尝试创建Person实例时:

let person = new Person("Alex")

我收到错误:

  

Union case Animal.Person:Person - >动物

     

类型'字符串'与“人物”

类型不兼容

问题:

是带有构造函数的

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

修改 Visual Studio for Windows不会显示错误,但是如果添加更多源代码,则会出现错误"' Person'不匹配' Animal'":

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

    person
    |> KnowAnimal
    |> printfn "%O"

1 个答案:

答案 0 :(得分:2)

  

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

首先Animal.Person不是类型,Person是类型,Animal是类型。 Animal.Person是以Animal为参数的Person类型的案例。也就是说,它作为Person -> Animal类型的函数,因此它采用类型Person的值并返回类型Animal的值。这两种类型之间没有子类型关系。

因此personPerson类型的值,Person person是类型Animal的值,因为Person需要Person并返回Animal