This question already has answers here:
Overlapping instances in Haskell
(2个答案)
Data.Vector.Binary overlaps Binary [a] instance
(1个答案)
Functor supertype has conflicting instances
(1个答案)
去年关闭。
由于某种原因,GHC似乎决定我的数据类型(带有两个类型参数)完全没有理由实例化Bifunctor。
最有趣的是,这只是用来告诉我该数据类型的Functor实例重叠,因为我为任何Bifunctor(以及一个特定的数据类型)给出了Functor的实例化。但是,如果我尝试对其进行bimap,它会告诉我没有Bifunctor实例。
可以预料到,因为我没有提供任何信息来表明Provenance实例化了Bifunctor,所以不会,所以从Bifunctor派生的Functor实例应该是无关紧要的。这是FlexibleInstances的错误吗?
这两个实例都匹配得很好。直到以后
您可以在this question中看到更多有关此内容的信息。 “解决方案”是使用GHC扩展名
(2个答案)
Data.Vector.Binary overlaps Binary [a] instance
(1个答案)
Functor supertype has conflicting instances
(1个答案)
去年关闭。
由于某种原因,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
这两个实例都匹配得很好。直到以后
(Don't care)
位才起作用。所以您有一些重叠的实例,这是一个问题。您可以在this question中看到更多有关此内容的信息。 “解决方案”是使用GHC扩展名
OverlappingInstances
进行玩具,它本身就是一个兔子洞。关于haskell - Haskell独立决定为我的数据类型推断Bifunctor吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56121803/
10-10 21:17