【发布时间】:2012-09-20 06:26:28
【问题描述】:
假设我有Heap a 类型,其中Heap 是类型* -> * 的类型构造函数。堆上的许多基本操作都要求 a 类型是 Ord 类型类的实例。
data Heap a = ...
findMin :: Ord a => Heap a -> a
deleteMin :: Ord a => Heap a -> Heap a
只要a 类型参数是Ord 类型类的实例,我想将我的Heap 类型声明为Foldable 类型类的实例(通过findMin 和deleteMin 函数)。
当我们处理需要* 类型的类型类时,可以轻松表达这种关系,例如Show:
instance Show a => Show (Heap a) where
show h = ...
但我在声明Foldable 时遇到问题:
instance Foldable Heap where
-- Ouch, there is no `a` type parameter to put the constraint on!
foldr f z h = ...
是否可以在此类实例声明中对a 类型参数施加约束?
【问题讨论】:
-
看看this stuff。他们正在用 monad 做类似的事情。
-
非常感谢您的链接,
ConstraintKind是真的有趣的东西! -
顺便说一句,
findMin真的需要Ord实例吗? -
一些实现(比如我在下面展示的基于慢速列表的实现)不需要对
findMin进行Ord约束,但其中一些实现(比如Okasaki 描述的SkewBinominalHeap)需要该约束.我想在现实生活中Heap应该是在findMin上具有Ord约束的类型类。