haskellghcjsreflex

How can I use ghci with my reflex project using only stack.yaml?


I've removed nix from my reflex project, having replaced it with stack. Everything is good, except being able to use the repl. I've tried to create a minimal reflex project to demonstrate what I have tried, and the errors my attempt produces.

https://github.com/mlitchard/reflex-todo

stack repl --stack-yaml=stack-ghc.yaml

Truncated error log

Error: -- While building custom Setup.hs for package jsaddle-dom 
-0.9.2.0 using: /home/mlitchard/.stack/setup-exe-cache/x86_64- 
linux/Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.2 --builddir=.stack- 
work/dist/x86_64-linux/Cabal-1.24.2.0 build lib:jsaddle-dom --ghc- 
options " -ddump-hi -ddump-to-file" Process exited with code: 
ExitFailure 1 Logs have been written to:

/home/mlitchard/projects/git/reflex-todo/.stack-work/logs/jsaddle-dom-0.9.2.0.log

Preprocessing library jsaddle-dom-0.9.2.0...
[587 of 599] Compiling JSDOM.Custom.XMLHttpRequest ( 
src/JSDOM/Custom/XMLHttpRequest.hs, .stack-work/dist/x86_64- 
linux/Cabal-1.24.2.0/build/JSDOM/Custom/XMLHttpRequest.o )

/home/mlitchard/projects/git/reflex-todo/.stack- 
work/downloaded/Vheiln5kqwE0/src/JSDOM/Custom/XMLHttpRequest.hs:39:46: 
error:
    • Could not deduce (Control.Monad.Catch.MonadThrow
                      Language.Javascript.JSaddle.Types.JSM)
    arising from a use of ‘throwM’
  from the context: MonadDOM m
    bound by the type signature for:
               throwXHRError :: MonadDOM m => Maybe XHRError -> m ()
    at src/JSDOM/Custom/XMLHttpRequest.hs:38:1-53
• In the second argument of ‘(.)’, namely ‘throwM’
  In the second argument of ‘maybe’, namely ‘(liftDOM . throwM)’
  In the expression: maybe (return ()) (liftDOM . throwM)

/home/mlitchard/projects/git/reflex-todo/.stack- 
work/downloaded/Vheiln5kqwE0/src/JSDOM/Custom/XMLHttpRequest.hs:42:20: 
error:
• No instance for (Control.Monad.Catch.MonadMask
                     Language.Javascript.JSaddle.Types.JSM)
    arising from a use of ‘bracket’
• In the first argument of ‘(.)’, namely ‘bracket aquire id’
  In the expression: bracket aquire id . const
  In an equation for ‘withEvent’:
      withEvent aquire = bracket aquire id . const

/home/mlitchard/projects/git/reflex-todo/.stack- 
work/downloaded/Vheiln5kqwE0/src/JSDOM/Custom/XMLHttpRequest.hs:45:31: 
error:
• Could not deduce (Control.Monad.Catch.MonadCatch
                      Language.Javascript.JSaddle.Types.JSM)
    arising from an operator section
  from the context: MonadDOM m
    bound by the type signature for:
               send' :: MonadDOM m => XMLHttpRequest -> Maybe JSVal -> m ()
    at src/JSDOM/Custom/XMLHttpRequest.hs:44:1-62
• In the expression: (`onException` abort self)
  In the second argument of ‘($)’, namely
    ‘(`onException` abort self)
     $ do { result <- liftIO newEmptyMVar;
            r <- withEvent
                   (onAsync self Generated.error . liftIO
                    $ putMVar result (Just XHRError))
                 $ withEvent
                     (onAsync self abortEvent . liftIO
                      $ putMVar result (Just XHRAborted))
                   $ withEvent (onAsync self load . liftIO $ putMVar result Nothing)
                     $ do { void
                            $ case mbVal of {
                                Nothing -> ...
                                Just val -> ... };
                            liftIO $ takeMVar result };
            throwXHRError r }’
  In the expression:
    liftDOM
    $ (`onException` abort self)
      $ do { result <- liftIO newEmptyMVar;
             r <- withEvent
                    (onAsync self Generated.error . liftIO
                     $ putMVar result (Just XHRError))
                  $ withEvent
                      (onAsync self abortEvent . liftIO
                       $ putMVar result (Just XHRAborted))
                    $ withEvent (onAsync self load . liftIO $ putMVar result Nothing)
                      $ do { void
                             $ case mbVal of {
                                 Nothing -> ...
                                 Just val -> ... };
                             liftIO $ takeMVar result };
             throwXHRError r }

Solution

  • The clue to the answer came from this project, https://github.com/nomeata/reflex-dom-fragment-shader-canvas.

    Specifically, this flag: package reflex-dom flags: +use-warp -webkit2gtk.

    I have updated the git project above to reflect a working stack.yaml file.