【问题标题】:What is wrong with my function testing for membership in a binary search tree?我对二叉搜索树成员资格的功能测试有什么问题?
【发布时间】:2015-02-25 11:23:30
【问题描述】:

假设我有以下数据类型:

data BinaryTree a = EmptyTree | Node a (BinaryTree a) (BinaryTree a) deriving (Eq, Ord, Show)

还有下面的函数

  member a EmptyTree = False
  member a (Node x l r)
    | a < x = member a l
    | a > x = member a r
    | a == x = True

此功能有效。

检查Node的类型:

:t Node
Node :: a -> BinaryTree a -> BinaryTree a -> BinaryTree a

但是,如果给成员函数一个签名: member :: Node a -&gt; BinaryTree a -&gt; Bool

(a 类型的Node 和a 类型的BinaryTree 产生Bool

它出错了:

Not in scope: type constructor or class ‘Node’
A data constructor of that name is in scope; did you mean DataKinds?

这是为什么呢?如何定义一个接受(并比较)任意类型的节点和树的函数?

【问题讨论】:

  • Node 不是类型,而是值。你想要member :: BinaryTree a -&gt; BinaryTree a -&gt; Bool
  • 我觉得应该是member :: a -&gt; BinaryTree a -&gt; Bool
  • @user3585010 呃,是的,看起来你是对的。

标签: haskell types binary-search-tree membership


【解决方案1】:

Node 不是类型;这是一个:

  • 完全应用时BinaryTree 类型的值
  • 此类值的数据构造函数 (a -&gt; BinaryTree a -&gt; BinaryTree a -&gt; BinaryTree a)

两者的含义相同,但在两种不同的上下文中实现外观会有所帮助,即模式匹配和构造。

您的member 函数很可能只需要检查元素是否存在:

member :: a -> BinaryTree a -> Bool

如果您需要对 a 进行额外的约束(对于二叉树,它将是 OrdEq,很可能,您也必须将它们放在那里。

member :: (Ord a, Eq a) => a -> BinaryTree a -> Bool

【讨论】:

  • 没有因使用 '==' 等而产生 (Eq a) 的实例。根据您的回答和一些谷歌搜索:member :: (Ord a) => a -> BinaryTree a -> Bool 如果您更新您的回复以反映我会接受它,谢谢!
  • @AbrahamP 这些是因为member 的实现而出现的,但是是的,你必须添加它们。
  • 我对 haskell 还很陌生,但我认为您的第一个要点有点错误。 Node 不是 BinaryTree 类型的值,而是 a -&gt; BinaryTree a -&gt; BinaryTree a -&gt; BinaryTree a 类型的值。
  • @CameronMartin 添加注释以避免进一步混淆。
  • OrdEq 的子类,不需要指定后者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
相关资源
最近更新 更多