出于某种原因,GHC 似乎毫无理由地决定我的数据类型(具有两个类型参数)实例化 Bifunctor。
最有趣的是,这仅用于告诉我该数据类型存在重叠的 Functor 实例,因为我为任何 Bifunctor(以及该数据类型的特定实例)提供了 Functor 的实例化。但是,如果我尝试对其进行 bimap,它会告诉我没有 Bifunctor 的实例。
{-# LANGUAGE FlexibleInstances #-}
module BifunctorError where
import Data.Bifunctor
instance Bifunctor f => Functor (f t) where
fmap = bimap id
data Provenance p t = Provenance p t
-- Uncomment and try to compile: Overlapping instances ???
--instance Functor (Provenance p) where
-- fmap f (Provenance p x) = Provenance p (f x)
我希望如此,因为我没有提供任何内容来表明 Provenance 实例化 Bifunctor,所以它不会,因此从 Bifunctor 派生的 Functor 实例应该是无关紧要的。这是FlexibleInstances 的错误吗?
最佳答案
当寻找匹配的类型类实例时,GHC 只查看头部,而不是条件。它作为辅助步骤匹配条件。因此,当 GHC 寻找 Functor
实例时,它看到的只是
instance (Don't care) => Functor (f t) where
instance (Don't care) => Functor (Provenance p) where
这两个实例都匹配得很好。 (不关心)
位直到稍后才会发挥作用。所以你有一些重叠的实例,这就是一个问题。
您可以在 this question 中看到更多相关信息。 。 “解决方案”是使用 GHC 扩展 OverlappingInstances
,它本身就是一个兔子洞。
关于Haskell 独立决定为我的数据类型推断 Bifunctor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56121803/