镜头和状态,库不一致

Lens and State, library inconsistencies

我正在尝试使用 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 () ,又一次,编译器returns 出现了类似的错误。怎么回事?

由于 Rufflewind 的提示,我通过修复包不一致问题解决了这个问题(请参阅上面对我的问题的评论)。

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