首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell独立决定为我的数据类型推断双函子吗?

Haskell独立决定为我的数据类型推断双函子吗?
EN

Stack Overflow用户
提问于 2019-05-14 01:22:41
回答 1查看 81关注 0票数 2

出于某种原因,GHC似乎正在决定我的数据类型(带有两个类型参数)可以毫无理由地实例化双函子。

最有趣的是,它只用于告诉我,这种数据类型存在着函子的重叠实例,因为我给出了任何Bifunctor的函子的实例化(以及数据类型的特定函子)。但是,如果我试图在上面做bimap,它就会告诉我,没有双函子的实例。

代码语言:javascript
复制
{-# 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吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-14 01:45:19

在寻找匹配的类型实例时,GHC只查看头部,而不是条件。作为第二步,它与条件匹配。所以当GHC正在寻找一个Functor实例时,它所看到的就是

代码语言:javascript
复制
instance (Don't care) => Functor (f t) where
instance (Don't care) => Functor (Provenance p) where

这两个例子都很匹配。(Don't care)位甚至要到稍后才会起作用。因此,您有一些重叠的实例,这是一个问题。

您可以在this question中看到关于这一点的更多信息。“解决方案”是玩玩GHC扩展OverlappingInstances,这本身就是一个小兔子洞。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56121803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档