我正在尝试使用Data.Map作为后端编写一个概率monad的Eric Kidd's和Sigfpe'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
约束,因此我遇到类型错误。
有一个简单的方法吗?