Error installing scion-browser

2019-07-21 18:53发布

问题:

I get the following error when trying to install the scion-browser package as follows:

% cabal install scion-browser-0.2.9
<snipped>
[23 of 23] Compiling Main             ( src/Main.hs, dist/build/scion-browser/scion-browser-tmp/Main.o )

src/Main.hs:31:24:
    No instance for (MonadException BrowserM)
      arising from a use of `getInputLine'
    Possible fix:
      add an instance declaration for (MonadException BrowserM)
    In a stmt of a 'do' block: maybeLine <- getInputLine ""
    In the expression:
      do { maybeLine <- getInputLine "";
           case maybeLine of {
             Nothing -> return ()
             Just line -> do { ... } } }
    In an equation for `loop':
        loop
          = do { maybeLine <- getInputLine "";
                 case maybeLine of {
                   Nothing -> return ()
                   Just line -> ... } }
cabal: Error: some packages failed to install:
scion-browser-0.2.9 failed during the building phase. The exception was:
ExitFailure 1

Any idea how to fix this?

Thanks.

回答1:

The problem is that haskeline-0.7.0.0 changed the used StateT type. In haskeline < 0.7, it used the Control.Monad.State module from mtl, in version 0.7.0.0, haskeline dropped the dependency on mtl and uses the StateT monad transformer of the transformers package directly. That would in itself not be a problem, since mtl now is just a wrapper around transformers. However, the module used by haskeline is Control.Monad.Trans.State.Strict, while Control.Monad.State from mtl wraps Control.Monad.Trans.State.Lazy. Thus the

instance MonadException m => MonadException (StateT s m) where
    controlIO f = StateT $ \s -> controlIO $ \(RunIO run) -> let
                    run' = RunIO (fmap (StateT . const) . run . flip runStateT s)
                    in fmap (flip runStateT s) $ f run'

from System.Console.Haskeline.MonadException is no longer for the StateT used by scion-browser.

The easy fix is to constrain haskeline to an earlier version,

cabal install --constraint="haskeline < 0.7" scion-browser

The other fix would be changing the imports in the scion-browser source to Control.Monad.State.Strict to make it build with haskeline-0.7.0.0.



标签: haskell cabal