Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 使用联合类型的相同名称创建新对象_F# - Fatal编程技术网

F# 使用联合类型的相同名称创建新对象

F# 使用联合类型的相同名称创建新对象,f#,F#,我想创建一个Person的实例。人是一种动物。当我试图创建一个Person时,IDE告诉我“这个表达式应该是'Person'类型,但是这里有'Animal'类型” 问题是,Person指的是受歧视的结合的类型和情况 您可以反转定义,以便将其解析为最后一个: type Animal = | Person of Person | Cat | Dog and Person (name) = member this.Name: string = name

我想创建一个Person的实例。人是一种动物。当我试图创建一个Person时,IDE告诉我“这个表达式应该是'Person'类型,但是这里有'Animal'类型”


问题是,
Person
指的是受歧视的结合的类型和情况

您可以反转定义,以便将其解析为最后一个:

type Animal =
    | Person of Person
    | Cat
    | Dog
and
    Person (name) =
        member this.Name: string = name

let person: Person = Person(name = "John")

// then to create an animal
let animal = Animal.Person (Person(name = "John"))
备选解决方案是使用注释中@MarcinJuraszek建议的
new
关键字,或考虑DU大小写和类型的不同名称。

在F#中,名称充当类型和值的绑定,您可以随时重新定义名称“指向”的内容。例如

因此
x
y
都是名为
a
的类型,但不同。同样的逻辑也适用于
Person
Animal.Person
,根据您定义它们的顺序,最后定义的将是键入
Person
时引用的

如前所述,您可以使用new或definitionorder来访问这两个。您还可以决定将
Person
类放在与
Animal
不同的模块中

module Inner = 
    type Person(name) ...

通过这种方式,您可以通过在模块名称前面加上前缀来访问您的类型。

我不确定为什么会这样,所以我不会将其添加为答案,但如果您添加
new
它会起作用:
让person:person=new person(name=“John”)
@MarcinJuraszek我不想使用“new”关键字,如果我使用“new”,IDE说我“新”是多余的。有趣。我只在F#Interactive中测试了它。“类型、异常或模块“Person”的重复定义”。在这个场景中,您如何创建类型为
Animal
Person
。联合人员没有参数,但人员类是。@JohnDoe在我的机器上以fsi和代码文件的形式工作。您使用的是哪个版本的VS/F?我知道在加载定义的顺序上发生了重大变化。不管怎样,你得到的错误表明了一些不同的东西,比如你在项目中遇到的其他东西。试着运行我在fsi上发布的剪报。之前不要忘记重置fsi会话。@Gustavo我正在VS代码中的单个文件中测试源代码。
// lets define type A
type A(name) = member this.Name : string = name
let x = A("test")

// lets "bind" the type name 'A' to a new type
type A(number) = member this.Number : int = number
let y = A(10)

printfn "type name of x: %s" (x.GetType().Name) // prints 'type name of x: A'
printfn "type name of y: %s" (y.GetType().Name) // prints 'type name of y: A'
module Inner = 
    type Person(name) ...