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

标签 haskell instance typeclass overlap bifunctor

出于某种原因,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/

相关文章:

haskell - 如何反序列化 JSON,其中相应的 Haskell 类型在运行时可作为值使用?

Haskell 函数接受函数或值,然后调用函数或返回值

c++ - 新命令不创建新对象 C++

c# - 使用对象初始值设定项时如何正确使用断点?

haskell - haskell 类型类中的多个类型参数

haskell - 在 ghci 下执行 `(read "[红色 ]")::[Color]` 时会发生什么?

haskell - 使用foldl时如何获取列表中元素的索引

Haskell 文本包选择

Android Fragment 和重新加载应用程序

haskell - Monad `fail` 与 MonadPlus `mzero` 的适当使用