在Haskell中为二叉搜索树实现O(log n)Foldable.elem

时间:2017-07-27 22:07:39

标签: haskell

考虑二元树的以下定义:

data Tree a = Nil | Node (Tree a) a (Tree a)

Foldable实例可以定义如下:

instance Foldable Tree where
  foldr _ z Nil = z
  foldr f z (Node l d r) = foldr f (f d (foldr f z l)) r

但问题是elem函数在O(n)而不是O(log n)中运行。当我尝试实现自定义elem

elem x Nil = False
elem x (Node l d r)
  | x == d = True
  | x < d = elem x l
  | otherwise = elem x r

我得到Could not deduce (Ord a) arising from a use of ‘<’。 如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您不能将此elem方法用于Foldable类,因为可折叠API要求其所有实例的elem实现能够搜索任何类型的任何元素,只有{ {1}}实例。 “所有Eq多态的elem”是Eq类型类设计中的有意选择。

您的Foldable函数虽然非常有用,但与elem类型类的elem方法不兼容,因为它对于类型类的需求不够通用。为您的类型导出Foldable函数的最佳方法是在类型类之外定义一个单独的函数。