Tree 向SML中的树添加节点

Tree 向SML中的树添加节点,tree,sml,Tree,Sml,有人建议我把这个问题作为一个单独的问题来问,这样我就可以了 我有一棵人的树,就像家谱一样。它从一个人开始,然后分支到父母、祖父母等。我希望能够将一个人插入树上的某个位置(基本上替换在场的任何人) 这些数据类型很重要: datatype year = Year of int | UnkYear | Irrelevant datatype name = Name of string | UnkName datatype sex = Man | Woman | UnkSex dat

有人建议我把这个问题作为一个单独的问题来问,这样我就可以了

我有一棵人的树,就像家谱一样。它从一个人开始,然后分支到父母、祖父母等。我希望能够将一个人插入树上的某个位置(基本上替换在场的任何人)

这些数据类型很重要:

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->tree,以便调用insert(t,pos,p)将person p插入树i中的position pos中-假设该位置存在于树中。如果没有,它应该返回t

所以我需要能够在我的树中找到一个人(比如说Mom)并用Lucy替换她(Mom和Lucy都是使用数据类型person预先声明的值)

到目前为止,我有:

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而且,模式匹配还没有完成


有什么办法让我搬到这里来吗?

好的,当你到达指定位置时,你想用指定的人替换树中该位置的人。你所做的是,你每一步都在替换这个人,除非你到达目的地,在这种情况下,你只需删除那里的节点

因此,您需要做的是:

如果父列表尚未为空,请不要将人员
n
替换为
p
——只需遍历到相应的子树中即可

如果家长列表为空,并且您当前在一个信息节点,请使用
p
替换该节点中的人员

如果父级列表为空,并且您当前处于Unspec节点,请使用包含
p
和两个空子树(即
Unspec
s)的新信息节点替换Unspec


如果您到达Unspec节点(尽管父节点列表尚未为空),只需返回
Unspec
,并根据分配保持树不变。

感谢您的帮助。我知道我做错了什么,但我似乎无法修复它。我决定从一开始就告诉它返回Info(n而不是Info)(p-我想这会阻止根变成p。但是我得到了这个:fn:aneTrae*forealdre list*'a->aneTrae-这是错误的。我知道你要我做什么,但我似乎无法将其转换为代码。帮助?@George:你得到了
'a
,因为你还没有实现使用
p
的情况,所以
p
获取一般类型
'a
。一旦您实现了它们,类型将是正确的。例如,在案例
|insert(Info(n,mf,ft),[],p)=
中,结果应该是一个
Info
-节点,其中
p
作为person和相同的子树。好的,现在我的代码看起来像这样:fun indsaet(Info(n,mf,ft),Mor::xs,p)=Info(n,mf,indsaet(ft,xs,p));indsaet(Info(n,mf,ft),Far::xs,p)=Info(n,indsaet(mf,xs,p),ft)| indsaet(Info(n,mf,ft),[],p)=Info(p,mf,ft)| indsaet((unsec),[],p)=unsec,我唯一缺少的是模式匹配。我在模式匹配方面很差劲:(@George:你需要一个案例,说明给定的位置实际上不存在,即你到达一个
unsec
,但列表还不是空的。所以
|indsaet(unsec,xs,p)=unsec
。有趣的是,在你回答我的问题之前,我自己就想出了一个答案。非常感谢你的帮助!