F#中的递归记录

时间:2013-06-07 18:33:49

标签: recursion f# record

我和朋友正在阅读F#,目前正忙着记录。

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

type Person =
  {name: string;
   father: Person;
   mother: Person;}

F#Interactive接受它,在某种程度上,类型是有道理的,除了我们看不到如何使用它。当我们试图宣布一个人时,我们必须在声明点声明父母,然后再声明他们的父母等等。有没有办法真正使用这种类型?如果没有,我们怎么能够创造它呢?

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

修改

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

2 个答案:

答案 0 :(得分:11)

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

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

let rec male = { name = "male"; father = male; mother = female }
  and female = { name = "female"; father = male; mother = female}

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

答案 1 :(得分: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) }

不使用Parent option fathermother,您必须创建一个“null parent”实例并使用该实例代替None