我正在尝试使用镜头修改StateT Monad Transformer中的状态。据我所知,这段代码应编译:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens (makeLenses, (+=))
import Control.Monad.State (State)
data Game = Game {
_player :: String,
_points :: Int
} deriving (Show)
makeLenses ''Game
play :: State Game ()
play = do
points += 10
return ()
main :: IO ()
main = undefined
但是ghc告诉我这个:
No instance for (mtl-2.1.3.1:Control.Monad.State.Class.MonadState
Game
(Control.Monad.Trans.State.Lazy.StateT
Game Data.Functor.Identity.Identity))
arising from a use of ‘+=’
...
我看到mtl
可能是问题,所以我输入ghc-pkg hide mtl
,然后再次编译:没有错误,它编译!
我安装了transformers
库,所以它正在使用它,这会有所帮助。
然后我通过更改以下两行来将State
更改为StateT
:import Control.Monad.State (State)
- > import Control.Monad.Trans.State (StateT)
和play :: State Game ()
- > play :: StateT Game IO ()
,再次,编译器返回类似的错误。发生了什么事?
答案 0 :(得分:1)
我通过修复包装不一致来解决这个问题,感谢Rufflewind的提示(请参阅上面我的问题的评论)。
我首先使用ghc-pkg check
检查了现有的包配置,然后使用ghc-pkg unregister --force
删除所有损坏的包。我反复重复它,直到找不到更多破损的包。然后我重新安装镜头,现在它可以工作。