我有一个任务,我不知道该怎么做。我有一棵人的树,上面有他们的名字、出生和死亡年份。在这里想想家谱。我有一堆数据类型来处理年龄、姓名、树本身等,然后我有一堆人和一棵树。
数据类型是:
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
首先,我需要能够从这个位置删除某人以及它“下”的所有内容 - 因此删除“妈妈”将删除妈妈和她的父母、祖父母等。如果在该位置没有人被调用,该函数应该返回树. 它应该是这样的: remove : Tree * parents list -> Tree 并且调用是 remove(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 的树 t 中 - 如果该位置不存在,它应该只返回树。插入:树*父母列表*人->树
我只是无法解决这个问题,我希望有人能够帮助我。我希望我已经足够清楚了(我知道它很长)。