首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型族:如何为一对数据类型家族实例化双函子?

类型族:如何为一对数据类型家族实例化双函子?
EN

Stack Overflow用户
提问于 2016-04-15 08:19:18
回答 1查看 104关注 0票数 0

我试图了解如何使用数据类型系列来隐藏构造函数。给出的一个简单的例子是一对操作要从和转换为普通对等的操作)。二进制函数的实例不编译;错误消息是

src/TypeFamilyTest.hs:66:21Bifunctor的第一个论点应该是* -> * -> *,但是Pairs a b有善良的ghc-prim-0.4.0.0:GHC.Prim.ConstraintBifunctor (Pairs a b)的实例声明中

尝试Bifunctor Pair where ...,我得到了另一条错误消息,列出了相同的GHC.Prim.Constraint。实例的正确参数是什么,以及如何传递上下文?

代码语言:javascript
复制
class  Pairs a b where
    data Vec2 a b  

    mkPair :: (a,b) -> Vec2 a b   -- (FirstF a, SecondF a) -> a
    splitPair :: Vec2 a b -> (a,b)
    fstP ::  Vec2 a b -> a
    sndP ::  Vec2 a b -> b
    fstP = fst . splitPair
    sndP = snd . splitPair

instance ( ) => Bifunctor (Pairs a b) where
     bimap opv oph vh = mkPair  (opv . fstP $ vh, oph . sndP $ vh)
EN

回答 1

Stack Overflow用户

发布于 2016-04-15 08:33:39

类型错误告诉您一切。Pair不是数据类型的名称。它是一个类的名称。Pair a b :: Constraint so Pair :: * -> * -> Constraint.Bifunctor只能由* -> * -> *类型的数据类型实例化。

我猜你的意思可能是这样的:

代码语言:javascript
复制
newtype Pair a b = Vec2 { splitPair :: (a, b) }

fstP :: Pair a b -> a
fstP = fst . splitPair

sndP :: Pair a b -> b
sndP = snd . splitPair

instance Bifunctor Pair where
    bimap f g (Vec2 (x, y)) = Vec2 (f x, g y)

我不明白为什么您最初将Vec2作为一个关联类型。我怀疑这可能是一个XY problem -你到底想要实现什么?

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

https://stackoverflow.com/questions/36641840

复制
相关文章

相似问题

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