렌즈를 사용하여 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
라이브러리가 설치되어 있으므로이를 사용하면 도움이됩니다. >import Control.Monad.Trans.State (StateT)
및 play :: State Game()
- ->play :: StateT Game IO()
, 다시, 컴파일러 유사한 오류를 반환 import Control.Monad.State (State)
:
그때 나는이 두 줄을 변경하여 StateT
에 State
을 변경합니다. 무슨 일이야?
두 개 이상의 mtl 버전이 설치되어 있습니까? 그렇다면 ghc가 한 프로그램에서 두 가지 버전의 mtl을 사용하고 있지 않은지 확인하십시오. – Rufflewind
사실 저는 두 가지 버전이 설치되어 있습니다. 그러나 컴파일하기 전에'ghc-pkg hide mtl'을 사용함으로써, 나는 그것이 변압기 라이브러리를 사용한다고 생각합니다. – Stephan
직접 ghc를 호출하는 대신 cabal 패키지를 빠르게 만들고 cabal을 사용하여 빌드하십시오. 당신이 의존성 갈등을 가지고 있다면, 도당은 당신에게 소리지를 것이다. 바라기를하면 문제가 더 분명해질 것입니다. – Rufflewind