首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell中实现二叉树的O(log ) Foldable.elem

在Haskell中实现二叉树的O(log ) Foldable.elem
EN

Stack Overflow用户
提问于 2017-07-28 06:07:39
回答 1查看 127关注 0票数 5

考虑以下二叉树的定义:

代码语言:javascript
复制
data Tree a = Nil | Node (Tree a) a (Tree a)

Foldable实例的定义如下:

代码语言:javascript
复制
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

代码语言:javascript
复制
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 ‘<’。如何解决此问题?

EN

回答 1

Stack Overflow用户

发布于 2017-07-28 06:36:27

您不能将此elem方法用于Foldable类,因为Foldable要求其所有实例的elem实现能够搜索任何类型的元素,其中只有一个Eq实例。“一个对所有Eq都是多态的elem”是在设计Foldable类型类时有意选择的。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45361801

复制
相关文章

相似问题

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