我的功能测试二元搜索树的成员资格有什么问题?

时间:2015-02-25 11:23:30

标签: haskell types binary-search-tree membership

假设我有以下数据类型:

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 -> BinaryTree a -> Bool

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

它出错了:

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

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

1 个答案:

答案 0 :(得分:7)

Node不是一种类型;这是一个:

  • 完全应用后BinaryTree类型的值
  • 此类值(a -> BinaryTree a -> BinaryTree a -> BinaryTree a
  • 的数据构造函数

两者的确意味着相同,但在两种不同的环境中实现外观可能会有所帮助,即模式匹配和构造。

你的member函数最有可能只需要元素来检查它的存在:

member :: a -> BinaryTree a -> Bool

如果您需要a的其他约束(在二叉树的情况下,它将是OrdEq,很可能,您也必须将它们放在那里

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