镜头和状态,库不一致

时间:2015-01-22 00:25:14

标签: haskell monad-transformers lens

我正在尝试使用镜头修改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更改为StateTimport Control.Monad.State (State) - > import Control.Monad.Trans.State (StateT)play :: State Game () - > play :: StateT Game IO (),再次,编译器返回类似的错误。发生了什么事?

1 个答案:

答案 0 :(得分:1)

我通过修复包装不一致来解决这个问题,感谢Rufflewind的提示(请参阅上面我的问题的评论)。

我首先使用ghc-pkg check检查了现有的包配置,然后使用ghc-pkg unregister --force删除所有损坏的包。我反复重复它,直到找不到更多破损的包。然后我重新安装镜头,现在它可以工作。