F# 什么';工会是否推断(并创建)类型?

F# 什么';工会是否推断(并创建)类型?,f#,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") 我得到一个错误: 联合

我有两种动物:

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")
我得到一个错误:

联合案例动物。人物:人物->动物

类型“string”与类型“Person”不兼容

问题:

Person是一个带有构造函数的

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

编辑: Visual Studio for Windows不显示错误,但如果添加更多源,则会出现错误“'Person'与类型'Animal'不匹配”:

[]
让主argv=
let person=新人(“Alex”)
人
|>知性动物
|>printfn“%O”
类型Animal.Person应该是Person的一个实例。那么,有什么问题

首先,动物。人不是一种类型,
Person
是一种类型,
Animal
是一种类型
Animal.Person
Animal
类型的一种,它将
Person
作为参数。也就是说,它作为类型
Person->Animal
的函数,因此它接受类型
Person
的值并返回类型
Animal
的值。这两种类型之间没有子类型关系


所以
person
是类型
person
的值,
person-person
是类型
Animal
的值,因为
person
接受
person
并返回
Animal
,所以你的问题是什么。它不起作用的原因与你上一个问题中它不起作用的原因相同。同样的解决方案也适用。请澄清。@Gustavo在我上一个问题中的“如何”,现在是“为什么”。Person是一个具有构造函数的类,类型为Animal。Person应该是Person的实例。那么,有什么问题吗?你确定你显示了正确的代码吗?当我运行你的代码时,我没有收到任何错误消息-它工作正常。
让person:Animal=person(newperson(“Alex”)
对,它的类型是person,而不是is。与此相同的区别是:
type Value=int的数量| String of String
Number
不是int,而是int。
[<EntryPoint>]
let main argv =
    let person = new Person("Alex")

    person
    |> KnowAnimal
    |> printfn "%O"