Recursion F中的递归记录#

Recursion F中的递归记录#,recursion,f#,record,Recursion,F#,Record,我和一个朋友正在读F#的书,现在正在乱搞唱片 我们为代表一个人做了以下记录: type Person = {name: string; father: Person; mother: Person;} F#Interactive接受它,并且在某种程度上,类型是有意义的,除非我们看不到如何使用它。当我们试图申报一个人时,我们必须在申报点申报父母,然后申报他们的父母等等。有没有什么方法可以实际使用这种类型?如果没有,我们怎么能创造它呢 PS:我们很清楚,因为父母是可选的,所以我们应

我和一个朋友正在读F#的书,现在正在乱搞唱片

我们为代表一个人做了以下记录:

type Person =
  {name: string;
   father: Person;
   mother: Person;}
F#Interactive接受它,并且在某种程度上,类型是有意义的,除非我们看不到如何使用它。当我们试图申报一个人时,我们必须在申报点申报父母,然后申报他们的父母等等。有没有什么方法可以实际使用这种类型?如果没有,我们怎么能创造它呢

PS:我们很清楚,因为父母是可选的,所以我们应该用option(一些x | None)类型封装他们

编辑

我的问题不是如何解决上述问题,PS中已经编写了解决方案。
我的问题是,我是否可以使用上述类型,例如,声明上述表格的个人记录?如果不是,我一定是做了一个不可用的类型。为什么我可以创建这样一个类型?

如果您将
父亲
母亲
声明为
父选项
,那么您可以像这样使用它:

let f = { name = "Father"; father = None; mother = None }
let m = { name = "Mother"; father = None; mother = None }
let c = { name = "Child"; father = Some(f); mother = Some(m) }

如果不为父亲和母亲使用
Parent选项
,则必须创建一个“null Parent”实例,并使用该实例而不是
None
,Lee显示了一个更有用的定义,但您可以创建
Person
类型的实例:

let rec loopy = { name = "loopy"; father = loopy; mother = loopy }


当然,如果你在为真实的人建模,这些根本没有帮助,但是编译器不知道这一点。例如,如果您试图定义一个循环,类似的递归类型可能很有用。

那么,您的问题是什么?如果您在人员字段中使用该选项,它将按预期工作。太好了!我不知道你可以在变量上使用'rec'关键字。我试着以同样的递归person作为起点,但没有使用'rec'关键字。我想,有了这样一个实体作为基本案例,记录可以被进一步使用,但是的,它并不实用,可以更好地解决。:-)
let rec male = { name = "male"; father = male; mother = female }
  and female = { name = "female"; father = male; mother = female}