1

有人建议我将此作为一个单独的问题提出,这样我就可以了。

我有一棵人的树,就像家谱一样。它从一个人开始,然后分支为父母、祖父母等。我希望能够将一个人插入树上的某个位置(基本上替换那里的任何人)。

这些数据类型很重要:

datatype year    = Year of int | UnkYear | Irrelevant
datatype name    = Name of string | UnkName
datatype sex     = Man | Woman | UnkSex
datatype person  = Person of name * sex * year * year
datatype parents = Dad | Mom
datatype tree    = Unspec | Info of person * tree * tree

赋值如下: 声明一个函数insert : tree * parents list * person -> tree,这样调用insert(t, pos, p)就会将person p插入到树i中的位置pos——假设位置存在于树中。如果不是,它应该返回 t。

所以我需要能够在我的树中取一个人(比如说妈妈)并将她替换为 Lucy(Mom 和 Lucy 都是使用数据类型 person 预先声明的值)。

到目前为止,我有这个:

fun insert (Info(n,mf,ft) , Mom::xs , p) = Info(p, mf, insert(ft,xs,p))
  | insert (Info(n,mf,ft) , Dad::xs , p) = Info(p, insert(mf,xs,p), ft)
  | insert (Info(n,mf,ft) , [] , p)      = Unspec

似乎要做的就是删除 t 的 pos 中的任何人并用 p 替换根 - 这不是我想要的:S 此外,模式匹配还没有完成。

有什么想法可以让我搬到这里吗?

4

1 回答 1

3

好的,当你到达给定的位置时,你想用给定的人替换树中那个点的人。您正在做的是,您在每一步都替换该人,除非您到达目的地,在这种情况下,您只需删除那里的节点。

所以你需要做的是:

在 parents-list 尚未为空的情况下,不要将 person 替换为n-p只需遍历相应的子树即可。

如果父母列表为空并且您当前位于信息节点,请将该节点中的人员替换为p.

在 parent-list 为空且您当前位于 Unspec 节点的情况下,将 Unspec 替换为包含p两个空子树(即Unspecs)的新 Info-node。

如果您到达 Unspec 节点,尽管 parents-list 还不是空的,只需 return Unspec,根据分配保持树不变。

于 2010-10-10T09:39:24.267 回答