考虑二元树的以下定义:
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 ‘<’
。
如何解决这个问题?
答案 0 :(得分:4)
您不能将此elem
方法用于Foldable类,因为可折叠API要求其所有实例的elem
实现能够搜索任何类型的任何元素,只有{ {1}}实例。 “所有Eq
多态的elem
”是Eq
类型类设计中的有意选择。
您的Foldable
函数虽然非常有用,但与elem
类型类的elem
方法不兼容,因为它对于类型类的需求不够通用。为您的类型导出Foldable
函数的最佳方法是在类型类之外定义一个单独的函数。