首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SML查找树中的字符

用SML查找树中的字符
EN

Stack Overflow用户
提问于 2020-03-29 15:02:52
回答 2查看 204关注 0票数 2

我对SML很陌生,我想把我的注意力集中在函数式编程上。我希望有一个函数,它接受树t和字符c,如果树包含该字符,则返回true或false。

我要实现的算法是:

  1. 如果叶为空返回false,
  2. (如果字符在叶中返回true ),
  3. 返回左树的结果或右树的结果(

)。

这是我的树数据类型

代码语言:javascript
复制
datatype 'a tree =
    Leaf of 'a
  | Node of 'a tree * 'a * 'a tree;

这就是功能

代码语言:javascript
复制
fun containsChar (Leaf t, c: char) = false 
  | containsChar (Node (left, t, right)) = 
    if t = c then true else false
  | containsChar (Node (left, t, right)) = (containsChar left) <> (containsChar right);

我要得到Unbound value identifier "c".为什么这是?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-30 01:07:24

那句话里没有什么叫"c“的。叶子里有一个"c“,但那是一个完全不同的情况。在其他情况下你忘了那个参数。

( if t = c then true else false相当于t = c。)

您在第二和第三子句中也有相同的模式,这是行不通的。

另一个问题是“叶子是空的”规则--叶子不能是“空的”。

我怀疑这是导致您误入歧途的原因,因为您的第一个子句的结果是false,尽管这个论点显然是一个现有的叶,而您的第二个子句显然不是一个叶,而是您的第二个规则。

你的规则应该是:

树包含一个字符当且仅当

  • 它是叶中的值,或
  • 是节点中的值,或者是包含在节点子树中的

在ML中(删除对char Tree的限制,因为它看起来是任意的),

代码语言:javascript
复制
fun contains (Leaf t, c) = t = c 
  | contains (Node (left, t, right), c) = t = c
                                       orelse contains(left, c)
                                       orelse contains(right, c) 
票数 3
EN

Stack Overflow用户

发布于 2020-03-30 01:51:44

您可以再次将该函数概括为

代码语言:javascript
复制
fun any p Leaf = false
  | any p (Node (left, x, right)) =
      p x orelse any p left orelse any p right

fun contains c t = any (fn x => c = x) t
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60916125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档