Они оба FRP (функциональная реактивная Программирование) в их основе - это означает, что у них есть дерево, сопоставленное с DOM, и только визуализировать этот компонент или детей, которые нужно визуализировать.(как кто-то указывал ранее, Elm отказался от принципов FRP, чтобы преследовать их собственную идею о них)
Они оба скомпилированы в JavaScript (хотя с библиотекой ClojureScript/Om или реагентом вы можете получить фактические объекты React в js) white Вяз делает свое дело. Мне не нравится, что Elm должен быть установлен через npm, хотя czapliki, как я понимаю, работает над автономным установщиком)
Elm лучше, на мой взгляд, потому что он управляет государством немного более удобным для кодера, и он очень приятный (как уже упоминалось -) синтаксис типа Haskell, а также вы перемещаете RuntimeErrors в CompileTimeErrors, который гораздо приятнее как разработчик, плюс он имеет более удобную поддержку кода.
С другой стороны, в cljs есть библиотеки лотов - некоторые из них, как я упоминал, возвращают фактические компоненты React (cljs/Om соответствуют 1: 1 с R.js LifeCycle) - другие просто уважают менталитет FRP и LifeCycle, не становясь обремененными им. Возможно, вам стоит взглянуть на Om/Next, у которого есть метод GraphQL для вызова данных из конечной точки и сбросил параметры async, которые использовались в простых cljs/Om.
Это вопрос вкуса быть честным, но я бы предпочел Элм (написав на обоих языках). Если вы все же делаете с cljs, убедитесь, что у вас хорошая библиотека и не делайте ничего в vanilla cljs, иначе вам будет жаль, если вы хотите поддерживать 5k + LOC. (Посмотрите Fulcro, Reagent, om, OmNext, hoplon и т. д.)
Этот вопрос может дать некоторую помощь: http://stackoverflow.com/q/15490053/90874 – thSoft