出于某种原因,GHC似乎正在决定我的数据类型(带有两个类型参数)可以毫无理由地实例化双函子。
最有趣的是,它只用于告诉我,这种数据类型存在着函子的重叠实例,因为我给出了任何Bifunctor的函子的实例化(以及数据类型的特定函子)。但是,如果我试图在上面做bimap,它就会告诉我,没有双函子的实例。
{-# 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)我认为,因为我没有提供任何信息来表示出处实例化双函子,所以从双函子派生的函子的实例应该是不相关的。这是FlexibleInstances的一个bug吗?
发布于 2019-05-14 01:45:19
在寻找匹配的类型实例时,GHC只查看头部,而不是条件。作为第二步,它与条件匹配。所以当GHC正在寻找一个Functor实例时,它所看到的就是
instance (Don't care) => Functor (f t) where
instance (Don't care) => Functor (Provenance p) where这两个例子都很匹配。(Don't care)位甚至要到稍后才会起作用。因此,您有一些重叠的实例,这是一个问题。
您可以在this question中看到关于这一点的更多信息。“解决方案”是玩玩GHC扩展OverlappingInstances,这本身就是一个小兔子洞。
https://stackoverflow.com/questions/56121803
复制相似问题