Haskell 独立决定为我的数据类型推断 Bifunctor?

Haskell independently deciding to infer Bifunctor for my datatype?

出于某种原因,GHC 似乎无缘无故地决定我的数据类型(具有两个类型参数)实例化 Bifunctor。

最有趣的是,这仅用于告诉我该数据类型存在重叠的 Functor 实例,因为我为任何 Bifunctor(以及该数据类型的特定 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 仅查看 head,而不查看条件。它匹配条件作为第二步。所以当 GHC 正在寻找一个 Functor 实例时,它看到的只是

instance (Don't care) => Functor (f t) where
instance (Don't care) => Functor (Provenance p) where

而且这两个实例都匹配得很好。 (Don't care) 位直到后来才发挥作用。所以你有一些重叠的实例,这是一个问题。

您可以在 this question 中看到更多相关信息。 "solution" 是玩弄 GHC 扩展 OverlappingInstances,它本身有点像兔子洞。