首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-XGeneralizedNewtypeDeriving与-XMultiParamTypeClasses的结合

-XGeneralizedNewtypeDeriving与-XMultiParamTypeClasses的结合
EN

Stack Overflow用户
提问于 2015-10-20 20:00:48
回答 1查看 227关注 0票数 2

以下代码导致错误:

代码语言:javascript
复制
{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses, StandaloneDeriving #-}

class Module a b where
    (*>) :: a -> b -> b

data D
newtype DWrapper = DW D    
instance Module D D    
deriving instance Module DWrapper DWrapper

错误:

代码语言:javascript
复制
No instance for (Module DWrapper D) arising from a use of ‘Main.*>’
In the first argument of ‘GHC.Prim.coerce’, namely
  ‘(Main.*>) :: DWrapper -> D -> D’
In the expression:
    GHC.Prim.coerce ((Main.*>) :: DWrapper -> D -> D) ::
      DWrapper -> DWrapper -> DWrapper
In an equation for ‘*>’:
    (*>)
      = GHC.Prim.coerce ((Main.*>) :: DWrapper -> D -> D) ::
          DWrapper -> DWrapper -> DWrapper
When typechecking the code for  ‘Main.*>’
  in a derived instance for ‘Module DWrapper DWrapper’:
  To see the code I am typechecking, use -ddump-deriv

因此,GHC正在寻找一个Module DWrapper D实例来派生请求的Module D D实例。我想这是合理的,但不是我想要的。有没有办法告诉GHC从哪个实例派生?GNTD是如何在MPTCs上工作的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-21 00:32:31

不幸的是,GeneralizedNewtypeDeriving只对多参数类型的最后一个参数起作用。即使是独立派生

  • 对于新类型,独立语法的泛化方式与普通deriving子句的泛化(第7.5.5节,“新类型的泛化派生实例”)完全相同。例如: 新类型Foo a= MkFoo (State )派生实例MonadState Int GHC总是将实例的最后一个参数(本例中的Foo)视为其实例正在派生的类型。

(顺便说一句,我试图搜索任何相关的GHC bug报告或特性请求,但都找不到。)

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

https://stackoverflow.com/questions/33245788

复制
相关文章

相似问题

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