F#中的递归记录

pha*_*haz 5 recursion f# record

我和朋友正在读F#,目前正在搞乱记录.

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

type Person =
  {name: string;
   father: Person;
   mother: Person;}
Run Code Online (Sandbox Code Playgroud)

F#Interactive接受它,并且在某种程度上,类型是有意义的,除了我们看不到如何使用它.当我们试图申报一个人时,我们必须在申报时宣布父母,并依次申报他们的父母等等.有没有办法真正使用这种类型?如果没有,我们怎么能创造它呢?

PS:我们很清楚,由于父项是可选的,我们应该用选项(Some x | None)类型封装它们.

编辑

我的问题不是如何解决上述问题,已经在PS中编写了一个解决方案.我的问题是,我可以实际使用上述类型,例如声明上述表格的人事记录吗?如果没有,我必须做一个无法使用的类型.为什么我可以制作这样的类型?

kvb*_*kvb 11

Lee显示了一个更有用的定义,但您可以创建一个Person类型的实例:

let rec loopy = { name = "loopy"; father = loopy; mother = loopy }
Run Code Online (Sandbox Code Playgroud)

要么

let rec male = { name = "male"; father = male; mother = female }
  and female = { name = "female"; father = male; mother = female}
Run Code Online (Sandbox Code Playgroud)

当然,如果你对真实的人进行建模,这些并没有任何帮助,但编译器并不知道.例如,如果您尝试定义循环,则类似的递归类型可能很有用.


Lee*_*Lee 9

如果您声明fathermother作为Parent option,那么你可以使用它像:

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) }
Run Code Online (Sandbox Code Playgroud)

不使用Parent optionfor father,mother你必须创建一个"null parent"实例并使用它而不是None.