У меня есть задание, и я не могу понять, что с этим делать. У меня есть дерево людей с их именами, годами рождения и смерти. Подумайте здесь о генеалогии. У меня есть куча типов данных, чтобы заботиться о возрасте, именах, самом дереве и т. д., а затем у меня есть куча людей и дерево.
Типы данных:
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 * parent 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 в дерево t в позиции pos - если позиция не существует, она должна просто вернуть дерево. вставка: дерево * список родителей * человек -> дерево
Я просто не могу понять это, и я надеюсь, что кто-то сможет мне помочь. Я надеюсь, что я был достаточно ясен в этом (я знаю, что это долго).