我正在尝试酸性状态
。 documentation声明 Update st
是 MonadState st
的一个实例。我尝试了不同的事情,但我的编译器不想看到这一点:(我尝试了 examples 中的 HelloWorld.hs
,但遇到了同样的问题:
HelloWorld.hs:26:7:
No instance for (MonadState
HelloWorldState (Update HelloWorldState))
arising from a use of `put'
Possible fix:
add an instance declaration for
(MonadState HelloWorldState (Update HelloWorldState))
In the expression: put (HelloWorldState newValue)
In an equation for `writeState':
writeState newValue = put (HelloWorldState newValue)
HelloWorld.hs:29:43:
No instance for (MonadReader
HelloWorldState (Query HelloWorldState))
arising from a use of `ask'
Possible fix:
add an instance declaration for
(MonadReader HelloWorldState (Query HelloWorldState))
In a stmt of a 'do' block: HelloWorldState string <- ask
In the expression:
do { HelloWorldState string <- ask;
return string }
In an equation for `queryState':
queryState
= do { HelloWorldState string <- ask;
return string }
我做错了什么?如何让它发挥作用?
我正在使用
酸状态-0.6.4
,
ghc-7.4.2,
debian-6.0.5
(amd64)
谢谢, 尤拉斯
添加: 看起来它在 ghc-7.4.1 中工作,但在 ghc-7.4.2 中不起作用。有人可以同时编译吗?
我尝试重新安装酸性状态,但没有帮助。 ghc-7.4.2 中的错误或我的环境 ID 已损坏。
最佳答案
好吧,我终于解决了。
问题在于安装了两个不同的 mtl
版本。隐藏错误的东西就解决了一切。
有趣的是我是如何得到它的:)
Prelude Data.Acid Control.Monad.State> :i Update
newtype Update st a
= acid-state-0.6.4:Data.Acid.Common.Update {acid-state-0.6.4:Data.Acid.Common.unUpdate :: transformers-0.2.2.0:Control.Monad.Trans.State.Lazy.State
st a}
-- Defined in `acid-state-0.6.4:Data.Acid.Common'
instance Monad (Update st)
-- Defined in `acid-state-0.6.4:Data.Acid.Common'
instance Functor (Update st)
-- Defined in `acid-state-0.6.4:Data.Acid.Common'
Prelude Data.Acid Control.Monad.State>
Control.Monad.State
重新导出 State
,但您可以看到 ghci 仍然显示 transformers-0.2.2.0:Control.Monad.Trans.State。 Lazy.State
完全合格。
关于haskell - Acid-state:更新的 MonadState 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11068272/