【问题标题】:Recursive records in F#F# 中的递归记录
【发布时间】:2013-06-07 18:33:48
【问题描述】:

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

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

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

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

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

编辑

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

【问题讨论】:

  • 那么,您的问题是什么?如果您将选项与 Person 字段一起使用,它应该可以按预期工作。

标签: recursion f# record


【解决方案1】:

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}

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

【讨论】:

  • 太棒了!我不知道您可以在变量上使用“rec”关键字。我试图以相同类型的递归人作为起点,但没有使用'rec'关键字。我想以这样的实体作为基本案例,记录可以进一步使用,但是是的,它并不是那么实用,可以更好地解决。 :-)
【解决方案2】:

如果您将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,您将不得不创建一个“空父”实例并使用它而不是None

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多