【问题标题】:Problem with a Functor instance over the keys in Map from Data.Map来自 Data.Map 的 Map 中键的 Functor 实例存在问题
【发布时间】:2026-02-17 16:50:01
【问题描述】:

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

我有一个数据类型是概率表:

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

a associate 类型变量的每个值是概率,它是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 约束,因此出现类型错误。

有没有简单的方法解决这个问题?

【问题讨论】:

    标签: haskell map instance typeclass functor


    【解决方案1】:

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

    【讨论】: