我有一项任务,我无法弄清楚如何处理它。我有一棵树,上面有他们的名字,出生和死亡年份。在这里思考家谱。我有一堆数据类型来处理年龄,名字,树本身等等,然后我有一堆人和一棵树。
数据类型为:
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
首先,我需要能够从这个位置移除某人以及“在”下面的所有内容 - 所以移除“妈妈”将移除母亲和她的父母,祖父母等。如果在该位置没有人被叫,则该功能应该归还树。应该是这样的: 删除:树*父母列表 - >树和呼叫被删除(t,pos)
这就是我所拥有的,但它并不完全正确。我被告知我可以用4行完成。
fun replace (Info(n,mf,ft) , Mom::[]) = Info(n,replace(mf,[]),Unspec)
| replace (Info(n,mf,ft) , Dad::[]) = Info(n,Unspec,replace(ft,[]))
| replace (Info(n,mf,ft) , []) = Info(n,mf,ft)
| replace (Info(n,mf,ft) , Mom::xs) = Info(n,replace(mf,[]),replace(ft,xs))
| replace (Info(n,mf,ft) , Dad::xs) = Info(n,replace(mf,xs),replace(ft,[]))
| replace (Unspec , x::xs) = Unspec
| replace (Unspec , []) = Unspec;
我有一个想法:
fun replace (Info(n,mf,ft) , Mom::xs) = Info(n,mf,replace(ft,xs))
| replace (Info(n,mf,ft) , Dad::xs) = Info(n,replace(mf,xs),ft)
| replace (Info(n,mf,ft) , []) = Info(n,mf,ft)
| replace (Unspec , xs) = Unspec;
但这不正确。我该怎么办?
我也应该能够将一个人p插入到位置pos的树中 - 如果该位置不存在,它应该只返回树。 insert:tree * parents list * person - >树
我无法理解这一点,我希望有人能够帮助我。我希望我已经足够清楚(我知道它很长)。
答案 0 :(得分:2)
(重新发布显然我之前的回答并没有在数据库崩溃中幸存下来。)
您正在选择列表的负责人来决定是否分支到母亲或父亲子树。这是对的。然后使用列表的尾部作为路径的其余部分。这也是正确的。但是当列表为空(即您已到达目的地)时,请执行以下操作:
| remove (Info(n,mf,ft) , []) = Info(n,mf,ft)
换句话说:没什么。如果您将其更改为:
| remove (Info(n,mf,ft) , []) = Unspec
它将按预期工作,用Unspec替换您的路径引导您的树的节点。