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
,它本身有点像兔子洞。
出于某种原因,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
,它本身有点像兔子洞。