我被建议将此问作为一个单独的问题,以便我这样做。
我有一棵树,就像家谱一样。它从一个人开始,分支到父母,祖父母等。我希望能够将一个人插入树上的一个地方(基本上取代那里的人)。
这些数据类型很重要:
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 - >树,因此调用insert(t,pos,p)将人p插入树i中的postion pos中 - 假设该位置存在于树中。如果不是,则应返回t。
所以我需要能够把一个人带到我的树上(让我们说妈妈)并用露西代替她(妈妈和露西都是使用数据类型的人预先声明的值)。
到目前为止,我有这个:
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的位置并用p替换根 - 不完全是我想要它做的:S此外,模式匹配没有完成。
让我搬到这里的任何想法?
答案 0 :(得分:3)
好的,当你到达给定的位置时,你想要用给定的人替换树中该点的人。你正在做的是,除了到达目的地之外,你每一步都要替换这个人,在这种情况下,你只需删除那里的节点。
所以你需要做的是:
如果parent-list尚未为空,请不要将n
替换为p
- 只需遍历相应的子树。
如果parent-list为空并且您当前位于Info-node,请使用p
替换该节点中的人员。
如果parents-list为空并且您当前位于Unspec节点,请将Unspec替换为包含p
的新Info-node和两个空子树(即Unspec
或多个)。
如果您到达Unspec节点,尽管parent-list尚未为空,只需返回Unspec
,保持树根据分配不变。