镜头和状态,库不一致
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
更改为 StateT
:import 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
删除了所有损坏的包。我反复重复它,直到找不到更多损坏的包裹。然后我重新安装镜头,现在可以了。
我正在尝试使用 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
更改为 StateT
:import 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
删除了所有损坏的包。我反复重复它,直到找不到更多损坏的包裹。然后我重新安装镜头,现在可以了。