| Tangential, but some very cool things are happening in Purescript-land, especially when it comes to row types or UI research: * https://github.com/natefaubion/purescript-variant (open variant types) * https://github.com/natefaubion/purescript-run (extensible effects implementation based on purescript-variant) * https://github.com/ajnsit/purescript-concur (time-reifying UI framework, there's also a Haskell and a JS implementation of Concur) * https://github.com/arthurxavierx/purescript-comonad-ui-todos (comonadic UIs) * https://github.com/paf31/purescript-purview (incremental lambda calculus UI library, this is mind blowing!) * https://github.com/paf31/purescript-sdom (declarative diff-less UI library) There's also [0], a mature UI framework used in production at Slamdata. Lumi [1] are writing their frontend in Purescript. What I especially like about Purescript is that the community is open to experimentation, while at the same time not being afraid to backtrack when things turn out to be a bad idea, like the row tagged Eff monad. The recent addition of QualifiedDo is a good example of this, which allows you to rebind >>= in the following manner: test :: forall m a. I.IxMonad m => m a a String
test = I.do
a <- I.pure "test"
b <- I.pure "test"
I.pure (a <> b)
Imo, there simply is no better way for a Haskeller to target JS at the moment.[0] https://github.com/slamdata/purescript-halogen [1] https://www.lumi.com |
When I tried using ps-concur or some other ps gui libraries, I didn't feel inclined to keep progressing. When I learnt reflex with ghcjs, I built stuff, and I kept finding new things I wanted to build.
The best way for a Haskell to target browsers at the moment is via ghcjs. Hopefully one day it'll be with a ghc-to-wasm compiler.