【发布时间】:2014-11-27 15:09:24
【问题描述】:
这是一个延伸 F# Recursive Tree Validation 的问题,我昨天已经很好地回答了。
这个问题涉及在现有树中插入一个孩子。这是我想使用的更新类型:
type Name = string
type BirthYear = int
type FamilyTree = Person of Name * BirthYear * Children
and Children = FamilyTree list
我的最后一个问题是关于检查树的有效性,这是我决定采用的解决方案:
let rec checkAges minBirth = function
| Person(_,b,_) :: t -> b >= minBirth && checkAges b t
| [] -> true
let rec validate (Person(_,b,c)) =
List.forall isWF c && checkAges (b + 16) c
现在我希望能够以以下形式插入一个人 Simon 作为特定人 Hans 的孩子
insertChildOf "Hans" simon:Person casperFamily:FamilyTree;;
因此,输入应该是父 name、child 和 家谱。理想情况下,它应该返回一个修改后的家谱,即 FamilyTree 选项
我正在努力的是合并 validate 函数以确保它是合法的,以及一种将其正确插入子列表中的方法,如果插入 Person 已经是父级 - 也许作为一个单独的函数。
欢迎并非常感谢所有帮助 - 谢谢! :)
【问题讨论】:
-
我猜如果名字匹配并且年龄无效它应该返回None,但是如果名字与家谱中的任何一个都不匹配怎么办?它应该返回未修改的树吗?你有没有想过这两种不同的情况?如果匹配多个名称怎么办?
-
首先;非常感谢您的宝贵时间!在无法插入的情况下,返回值应为 None。也就是说,如果年龄不匹配,或者你找不到名字。暂时让我们说不会有重复的名字:p