我有一个RWST Monad,并且有一些通用函数可以与它的Writer部分交互。
作为参考,RWST如下所示:
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,它是这样的:
type Definition = RWS SapphireReader DefWriter DefState其中DefWriter只是type DefWriter = Seq Error (错误是由我定义的,而不是Control.Monad.Error的)。
我的工作职责是:
tellPError :: Position -> ParseError -> Definition ()
tellPError posn err = tell (singleton $ PError posn err)现在我需要一个新的RWST并希望有一个通用的tellPError,我尝试删除签名,在ghci中加载文件并执行:t tellPError。
λ :t tellPError
tellPError :: MonadWriter (Seq Error.Error) m => Position -> ParseError -> m ()我尝试在代码中给我的函数这个签名,它不会编译:
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 ()我真的需要这个旗子吗?我试过了,它确实编译了,但无法工作。
发布于 2014-09-12 08:36:02
问题是,根据Haskell 2010年的报告部分4.1.2和4.1.3,类约束必须是以下形式:
class → qtycls tyvar
| qtycls ( tyvar atype1 … atypen ) (n ≥ 1) 其中qtycls是一个类名,tyvar是一个类型变量,而atype基本上是任何类型。但是,请注意,这两条规则都是qtycls (? tyvar ...格式的。
但是,该签名包含约束:
MonadWriter (Seq Error.Error) m其形式如下:
qtycls (gtycon1 gtycon2) tyvar因此出现了错误:gtycon1应该是类型变量,而不是类型构造函数。为了表达这个禁忌,您必须使用-XFlexibleContexts扩展。
另一种方法是消除约束,通过指定您想要的单一m,从而减少多态性。
发布于 2014-09-12 07:19:26
好的,我一直在研究这个问题,并想出了一个想法,指定在RWS的右边是一个=>,这似乎很有用:
tellPError :: Position -> ParseError -> RWS r (Seq Error) s ()
tellPError posn err = tell (singleton $ PError posn err)编译和工作它应该如何!
https://stackoverflow.com/questions/25802223
复制相似问题