2015-01-22 1 views
2

Я пытаюсь использовать объектив для изменения состояния в трансформаторе 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(), и снова, компилятор возвращает подобную ошибку. Что происходит?

+2

У вас установлено более 1 версии mtl? Если да, убедитесь, что ghc не использует две разные версии mtl в одной программе. – Rufflewind

+0

На самом деле у меня есть две версии. Но, используя 'ghc-pkg hide mtl' перед компиляцией, я думаю, что он использует библиотеку трансформаторов. – Stephan

+1

Вместо того, чтобы напрямую обращаться к ghc, подумайте о том, чтобы сделать пакет для кэбля реальным быстрым, а затем построить его с помощью cabal. Если у вас есть конфликт зависимости, каббал будет кричать на вас. Надеюсь, это сделает проблему более очевидной. – Rufflewind

ответ

1

Я решил это, установив несоответствия пакета, благодаря подсказке Rufflewind (см. Комментарий к моему вопросу выше).

Сначала я проверил существующую конфигурацию пакета с помощью ghc-pkg check, а затем использовал ghc-pkg unregister --force, чтобы удалить все сломанные пакеты. Я повторял его итеративно, пока не обнаружили более сломанных пакетов. Затем я переустановил объектив, и теперь он работает.