从Data.Map中的Map中的键上的Functor实例出现问题

时间:2011-04-02 03:41:26

标签: haskell map instance typeclass functor

我正在尝试使用Data.Map作为后端编写一个概率monad的Eric Kidd'sSigfpe's代码,但我遇到了一个Functor实例。

我的数据类型是概率表:

newtype Prob f a = Prob {table :: Map a f}

在类型a关联的变量的每个值处是概率,其类型为Floating f => f。该实例应该由:

instance (Floating f) => Functor (Prob f) where 
   fmap f (Prob tab) = Prob (mapKeysWith (+) f tab)

mapKeysWith的类型为(Ord k2) => Map k1 a -> (a -> a -> a) -> (k1 -> k2) -> Map k2 a。我无法在实例中强制执行Ord约束,因此我遇到类型错误。

有一个简单的方法吗?

1 个答案:

答案 0 :(得分:3)

没什么比这简单,我害怕;这是Functor(和Monad)的一个众所周知的问题。像往常一样,Oleg有一个solution(对于Set,但Map以相同的方式解决),如果您可以重写以使用替换Functor实例。 (另请参阅liboleg上的Hackage。)