我有一个任务,我无法弄清楚该怎么做 . 我有一棵树,上面有他们的名字,出生和死亡年份 . 在这里思考家谱 . 我有一堆数据类型来处理年龄,名字,树本身等等,然后我有一堆人和一棵树 .
数据类型是:
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
首先,我需要能够从这个位置移除某人以及“在”下面的所有内容 - 所以删除“妈妈”会删除妈妈和她的父母,祖父母等等 . 如果在被调用的位置没有人,该功能应该返回树 . 它应该是这样的:删除:树*父母列表 - >树和调用是删除(吨,位)
这就是我所拥有的,但它并不完全正确 . 我被告知我可以用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 * parent list * person - > tree
我无法理解这一点,我希望有人能够帮助我 . 我希望我已经足够清楚(我知道它很长) .
1 回答
(重新发布显然我之前的答案没有在数据库崩溃中幸存下来) .
你是在列表的头部决定是否分支到母亲或父亲子树 . 这是对的 . 然后使用列表的尾部作为路径的其余部分 . 这也是正确的 . 但是,如果列表为空(即您已到达目的地),则执行以下操作:
换句话说:没什么 . 如果您将其更改为:
它将按预期工作,用Unspec替换路径引导您到达的树的节点 .