Я пытаюсь использовать объектив для изменения состояния в трансформаторе StateT Monad. Насколько я понимаю, этот код должен составить:Объектив и состояние, несоответствия в библиотеке
{-# 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()
, и снова, компилятор возвращает подобную ошибку. Что происходит?
У вас установлено более 1 версии mtl? Если да, убедитесь, что ghc не использует две разные версии mtl в одной программе. – Rufflewind
На самом деле у меня есть две версии. Но, используя 'ghc-pkg hide mtl' перед компиляцией, я думаю, что он использует библиотеку трансформаторов. – Stephan
Вместо того, чтобы напрямую обращаться к ghc, подумайте о том, чтобы сделать пакет для кэбля реальным быстрым, а затем построить его с помощью cabal. Если у вас есть конфликт зависимости, каббал будет кричать на вас. Надеюсь, это сделает проблему более очевидной. – Rufflewind