【发布时间】:2012-10-16 19:35:55
【问题描述】:
我目前在Learn you a Haskell 的Chapter 8 中,并且我已经到达Functor 类型类的部分。在上述部分中,作者给出了如何使不同类型成为类实例的示例(例如Maybe、自定义Tree 类型等)。看到这一点,我决定(为了好玩和练习)尝试实现一个实例对于Data.Set 类型;当然,所有这些都忽略了Data.Set.map。
实际实例本身非常简单,我将其写为:
instance Functor Set.Set where
fmap f empty = Set.empty
fmap f s = Set.fromList $ map f (Set.elems s)
但是,由于我碰巧使用了函数fromList,这带来了一个类约束,要求Set 中使用的类型为Ord,正如编译器错误所解释的那样:
Error occurred
ERROR line 4 - Cannot justify constraints in instance member binding
*** Expression : fmap
*** Type : Functor Set => (a -> b) -> Set a -> Set b
*** Given context : Functor Set
*** Constraints : Ord b
我尝试对实例施加约束,或向fmap 添加类型签名,但均未成功(两者也是编译器错误。)
在这种情况下,如何实现和满足约束?有没有可能的方法?
提前致谢! :)
【问题讨论】: