5

我和一个朋友正在阅读 F#,目前正在搞乱记录。

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

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

F# Interactive 接受它,并且在某种程度上,该类型是有意义的,只是我们看不到如何使用它。当我们试图声明一个人时,我们必须在声明的时候声明父母,然后依次声明他们的父母等等。有没有办法实际使用这种类型?如果没有,为什么我们甚至能够创造它?

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

编辑

我的问题不是如何解决上述问题,解决方案已经写在 PS 中。我的问题是,我可以实际使用上述类型,例如声明上述形式的人员记录吗?如果没有,我一定是做了一个无法使用的类型。为什么我可以做出这样的类型?

4

2 回答 2

12

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}

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

于 2013-06-07T18:56:27.923 回答
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 optionfor fathermother您将不得不创建一个“空父”实例并使用它而不是None.

于 2013-06-07T18:44:46.530 回答