2015-01-22 3 views
2

렌즈를 사용하여 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) :

그때 나는이 두 줄을 변경하여 StateTState을 변경합니다. 무슨 일이야?

+2

두 개 이상의 mtl 버전이 설치되어 있습니까? 그렇다면 ghc가 한 프로그램에서 두 가지 버전의 mtl을 사용하고 있지 않은지 확인하십시오. – Rufflewind

+0

사실 저는 두 가지 버전이 설치되어 있습니다. 그러나 컴파일하기 전에'ghc-pkg hide mtl'을 사용함으로써, 나는 그것이 변압기 라이브러리를 사용한다고 생각합니다. – Stephan

+1

직접 ghc를 호출하는 대신 cabal 패키지를 빠르게 만들고 cabal을 사용하여 빌드하십시오. 당신이 의존성 갈등을 가지고 있다면, 도당은 당신에게 소리지를 것이다. 바라기를하면 문제가 더 분명해질 것입니다. – Rufflewind

답변

1

나는 Rufflewind (위의 질문에 대한 의견 참조)의 힌트 덕분에 패키지 불일치를 수정하여 해결했습니다.

먼저 기존 패키지 구성을 ghc-pkg check으로 확인한 다음 ghc-pkg unregister --force을 사용하여 손상된 패키지를 모두 제거했습니다. 더 이상 깨진 패키지가 발견되지 않을 때까지 반복적으로 반복했습니다. 그런 다음 렌즈를 다시 설치했는데 이제 작동합니다.