【问题标题】:Adding a node to a tree in SML在 SML 中将节点添加到树中
【发布时间】:2012-10-04 22:58:40
【问题描述】:

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

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

这些数据类型很重要:

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 的位置 pos 中——假设该位置存在于树中。如果不是,它应该返回 t。

所以我需要能够在我的树中取一个人(比如说妈妈)并将她替换为 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 的 pos 中的任何人,并用 p 替换根 - 这不是我想要的:S 此外,模式匹配还没有完成。

有什么想法可以让我搬到这里吗?

【问题讨论】:

    标签: tree sml


    【解决方案1】:

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

    所以你需要做的是:

    在 parents-list 还不是空的情况下,不要用 p 替换人 n - 只需遍历到相应的子树即可。

    如果父母列表为空并且您当前位于信息节点,请将该节点中的人员替换为p

    如果父母列表为空并且您当前位于 Unspec 节点,请将 Unspec 替换为包含 p 和两个空子树(即 Unspecs)的新信息节点。

    如果您到达 Unspec 节点,但父母列表尚未为空,只需返回 Unspec,按照分配保持树不变。

    【讨论】:

    • 感谢您的帮助。我可以看到我做错了什么,但我似乎无法修复它。我决定从小处着手,告诉它返回 Info(n 而不是 Info(p - 我认为这会阻止根变为 p。但是我得到了这个: fn : aneTrae * foraeldre list * 'a -> aneTrae - 那就是错了。我明白你要我做什么,但我似乎无法将其转化为代码。帮助?
    • @George:你得到了'a,因为你还没有实现使用p的情况,所以p得到了一般类型'a。一旦你实现了它们,类型将是正确的。例如,在| insert (Info(n,mf,ft) , [] , p) = 的情况下,结果应该是Info-node,p 作为人员和相同的子树。
    • 好吧,我的代码现在看起来像这样: 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 ((Unspec) , [] , p) = Unspec;现在它似乎做了我想做的事情(它是否正确),我唯一缺少的是模式匹配。我不擅长模式匹配:(
    • @George:当给定位置实际上不存在时,您需要一个案例,即您到达Unspec,但列表还不是空的。所以| indsaet (Unspec , xs , p) = Unspec.
    • 有趣的是,在你回答我的问题之前,我自己想出了一个答案。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多