Aah, fair point, it is pretty niche. Still, merely going off of their comparative contribution graphs [1] [2] and issue trackers [3] [4], it seems like Frege has a fair bit more throughput: for better or for worse, it seems like more _things_ are happening. Although I'll be the first to admit it's a misleading metric for determining the maturity of a project, it's still something. Imagine finding a bug in Frege: it seems like they merge even small patches from contributors, whereas ocamljava is essentially a one man show. Adopting ocamljava would probably mean forking and maintaining it too, whereas there's a possibility of just contributing to Frege.
That's all just my opinion, of course, and I hardly have enough industry experience to back up its validity! 'Just sanity checking my reasoning :)
Yes, but I have ... reservations. Same as with OCaml, I took on a small project with Scala and enjoyed the language, but only after carving out a subset of it that was palatable. Although it fits the bill, I'd be worried that enforcing conventions would become a large burden.
Unlike Frege where I (might? Frege's the only language of the three that I haven't investigated thoroughly) can point learners to essentially any Haskell tutorial and have them vaguely do 'the right thing', there exists a subset of Scala developers who use the language like Java with type inference. With Frege I could, for example, merely enforce the minimal usage of IO or State, but doing so with Scala is more complicated (maybe force the usage of cats/scalaz and their equivalent monads? It's still very easy to not use them, however). If there were an equivalent to F# on the JVM I'd settle on it in a heartbeat, but the dearth of well supported, pure functional languages makes this a tough choice. All in all, I'll probably go with pure4j, but it would be nice to stop writing Java at some point in my career.
Don't underestimate Haskell style variability--there are well-known 'schools' of Haskell writing style ... look up the Glasgow style, the Utrecht style etc. Frege, being on the JVM, adds its own twists on top of the standard Haskell syntax, from having to interop with Java classes. Essentially, it treats most Java classes as being in the IO monad because of their mutability and unbounded effects.
Yes, people can write Scala in 'Java style' or 'Haskell style' (not exactly), but I've come to think of that as a strength. Your colleagues can always start out near their comfort zone of imperative Java, and you can start out at yours, and you can slowly refactor your way towards each other. You can give Scala design talks to familiarise the team with best practices. With Haskell/Frege, you don't have that luxury. Everyone jumps in at the deep end.
About enforcing monad use: yes, it's possible to do that in Scala, but you're right that it has to be under the 'honour system'. About F#, it's not a pure functional language either. It's about as pure as OCaml and Scala.
As for pure4j, the reason I don't recommend it is that it makes it very clear that it's all in an experimental stage. So I have no idea which direction it's going.
That's all just my opinion, of course, and I hardly have enough industry experience to back up its validity! 'Just sanity checking my reasoning :)
[1]: https://github.com/Frege/frege/graphs/contributors
[2]: https://github.com/xclerc/ocamljava/graphs/contributors
[3]: https://github.com/Frege/frege/issues
[4]: https://github.com/xclerc/ocamljava/issues