首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能做些什么使这个ghci推断的签名来编译

我能做些什么使这个ghci推断的签名来编译
EN

Stack Overflow用户
提问于 2014-09-12 06:38:35
回答 2查看 75关注 0票数 0

我有一个RWST Monad,并且有一些通用函数可以与它的Writer部分交互。

作为参考,RWST如下所示:

代码语言:javascript
复制
newtype RWST r w s m a = RWST {runRWST :: r -> s -> m (a, s, w)}
instance (Monoid w, Monad m) => Monad (RWST r w s m)
instance Functor m => Functor (RWST r w s m)
instance (Monoid w, MonadFix m) => MonadFix (RWST r w s m)
instance (Monoid w, MonadPlus m) => MonadPlus (RWST r w s m)
instance Monoid w => MonadTrans (RWST r w s)
instance (Monoid w, MonadIO m) => MonadIO (RWST r w s m)
instance (Monoid w, Monad m) => MonadWriter w (RWST r w s m)
instance (Monad m, Monoid w) => MonadState s (RWST r w s m)
instance (Monad m, Monoid w) => MonadReader r (RWST r w s m)
instance (Monoid w, Monad m) => MonadRWS r w s (RWST r w s m)

所以我有一个数据Definition,它是这样的:

代码语言:javascript
复制
type Definition = RWS SapphireReader DefWriter DefState

其中DefWriter只是type DefWriter = Seq Error (错误是由我定义的,而不是Control.Monad.Error的)。

我的工作职责是:

代码语言:javascript
复制
tellPError :: Position -> ParseError -> Definition ()
tellPError posn err = tell (singleton $ PError posn err)

现在我需要一个新的RWST并希望有一个通用的tellPError,我尝试删除签名,在ghci中加载文件并执行:t tellPError

代码语言:javascript
复制
λ :t tellPError
tellPError :: MonadWriter (Seq Error.Error) m => Position -> ParseError -> m ()

我尝试在代码中给我的函数这个签名,它不会编译:

代码语言:javascript
复制
Non type-variable argument
      in the constraint: MonadWriter (Seq Error) m
    (Use -XFlexibleContexts to permit this)
    In the type signature for `tellPError':
      tellPError :: MonadWriter (Seq Error) m =>
                    Position -> ParseError -> m ()

我真的需要这个旗子吗?我试过了,它确实编译了,但无法工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-12 08:36:02

问题是,根据Haskell 2010年的报告部分4.1.24.1.3,类约束必须是以下形式:

代码语言:javascript
复制
class   →   qtycls tyvar
        |   qtycls ( tyvar atype1 … atypen )        (n ≥ 1) 

其中qtycls是一个类名,tyvar是一个类型变量,而atype基本上是任何类型。但是,请注意,这两条规则都是qtycls (? tyvar ...格式的。

但是,该签名包含约束:

代码语言:javascript
复制
MonadWriter (Seq Error.Error) m

其形式如下:

代码语言:javascript
复制
qtycls (gtycon1 gtycon2) tyvar

因此出现了错误:gtycon1应该是类型变量,而不是类型构造函数。为了表达这个禁忌,您必须使用-XFlexibleContexts扩展。

另一种方法是消除约束,通过指定您想要的单一m,从而减少多态性。

票数 2
EN

Stack Overflow用户

发布于 2014-09-12 07:19:26

好的,我一直在研究这个问题,并想出了一个想法,指定在RWS的右边是一个=>,这似乎很有用:

代码语言:javascript
复制
tellPError :: Position -> ParseError -> RWS r (Seq Error) s ()
tellPError posn err = tell (singleton $ PError posn err)

编译和工作它应该如何!

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

https://stackoverflow.com/questions/25802223

复制
相关文章

相似问题

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