ReasonML против Elm

Я видел этот вопрос ReasonML vs TypeScript здесь, в StackOverflow, теперь мне интересно, как ReasonML и Elm сравниваются друг с другом.

Каковы их сходства и различия? Какой я должен использовать, когда? Какое преимущество одного над другим?

Ответ 1

Я не очень хорошо знаком с Вяжем, но я немного изучил его, и я хорошо знаком с Разумом, поэтому я сделаю это. Я уверен, что здесь будут неточности, поэтому, пожалуйста, не принимайте ничего, что я говорю как факт, но использую его вместо этого в качестве указателей на то, что нужно детально изучить, если это имеет для вас значение.

Оба Elm и Reason - это ML-подобные языки с очень похожими моделями программирования, поэтому я сосредоточусь на различиях.

Синтаксис: Elm использует синтаксис типа Haskell, который разработан (и/или развит) для модели программирования, используемой как Elm, так и Reason, поэтому должен хорошо работать для чтения и записи идиоматического кода, когда вы знакомы с ним, но будет казаться очень разные и незнакомые большинству программистов.

Разум пытается быть более доступным, максимально используя синтаксис JavaScript, который будет знаком большинству программистов. Однако он также направлен на поддержку всего набора функций базового языка OCaml, что делает некоторые функциональные шаблоны довольно неудобными.

Одним из примеров этого является синтаксис функционального приложения, который в Elm подчеркивает кардинальную природу функций (fab) и отлично работает для составления функций и создания читаемых DSL. Обоснованный синтаксис в выражении (f(a, b)) скрывает эту сложность, что облегчает переход (пока вы случайно не нажмете на него, так как он, конечно, все еще отличается под ним), но сильно использует состав функций беспорядок круглых скобок,

Мудрость: Вяз - это чисто функциональный язык, который велик в теории, но бросает вызов на практике, поскольку окружающий мир мало заботится о поисках Вялости для чистоты. Полагаю, что предпочтительным решением Elm для этого является выделение примеси путем написания кода нарушения в JavaScript вместо этого и последующего доступа к нему в Elm через веб-компоненты или порты. Это означает, что вам, возможно, придется поддерживать значительное количество кода на отдельном и очень небезопасном языке, довольно немного шаблона для их соединения, а также для определения того, как соответствовать круглым вещам, хотя квадратные отверстия портов и т.д. первое место.

Разум, с другой стороны,... прагматичный, как мне нравится его называть. Вы жертвуете некоторой безопасностью, идеалами и долгосрочными преимуществами для повышения производительности и краткосрочных преимуществ. Изолирование примесей по-прежнему является хорошей практикой в Разуме, но вы неизбежно собираетесь делать короткие сокращения, чтобы добиться успеха, и это вас укусит позже.

Но даже если вам удается быть достаточно дисциплинированным, чтобы изолировать всю нечистоту, вам все равно придется заплатить за мутацию на языке. Часть этой цены - это то, что называется ограничением стоимости, которое вы рано или поздно столкнетесь, и это будет как запутывать, так и разгневать вас, поскольку оно будет отклонять код, который интуитивно должен работать, только потому, что компилятор не может доказать, что в какой-то момент не может быть измененной ссылкой.

Функциональность JavaScript: Как упоминалось выше, Elm обеспечивает возможность взаимодействия с JavaScript через порты и веб-компоненты, которые преднамеренно весьма ограничены. Раньше вы могли использовать собственные модули, которые предлагали гораздо большую гибкость (и способность стрелять в ногу), но эта возможность уходит (по крайней мере, для плебеев), шаг, который не был бесспорным (но также и не следует удивлять, учитывая философию). Подробнее об этом изменении читайте здесь.

Причина, или, скорее, BuckleScript, предоставляет богатый набор примитивов, которые могут напрямую связываться с JavaScript, и очень часто создают идиоматический интерфейс Reason без необходимости писать какой-либо код клея. И хотя он не очень интуитивно понятен, это довольно легко сделать, как только вы его поймаете. Это также легко сделать неправильно, и взорвать его в лицо в какой-то случайной точке позже. Независимо от того, какой код клея вам нужно написать, чтобы обеспечить хороший идиоматический API, можно написать в Reason со всеми его гарантиями безопасности вместо того, чтобы писать небезопасный JavaScript.

Экосистема: Вследствие ограниченной функциональности JavaScript, совместимой с использованием JavaScript, экосистема довольно мала. Существует не очень много качественных сторонних библиотек JavaScript, которые предоставляют веб-компоненты, и для этого требуется много усилий. Таким образом, вы увидите, что библиотеки реализуются непосредственно непосредственно в Elm, что, конечно же, требует еще больших усилий, но часто приводит к повышению качества, поскольку они специально предназначены для Elm.

Инструмент: Elm славится своими замечательными сообщениями об ошибках. Причина в значительной степени не делает, хотя она и стремится. Это, по крайней мере, частично потому, что Reason сам по себе не является компилятором, а вместо этого построен поверх компилятора OCaml, поэтому доступная информация ограничена, а площадь возможных ошибок очень велика. Но они также не так продуманы.

У Elm также есть отличный инструмент для упаковки, который устанавливает все для вас и даже проверяет, изменился ли интерфейс пакета, который вы публикуете, и что версия bump соответствует семантическому управлению версиями. Resaon/BuckleScript просто использует npm и требует, чтобы вы управляли всеми причинами Reason/BuckleScript вручную, например, обновляя bsconfig.json с новыми зависимостями.

Разум, BuckleScript, его система сборки и OCaml все быстро пылают. Мне еще предстоит испытать любой проект, занимающий более 3 секунд для компиляции с нуля, включая все зависимости, а инкрементная компиляция обычно занимает всего миллисекунды (хотя это не совсем без затрат на удобство использования). Вязь, как я понимаю, не так впечатлен.

У Elm and Reason есть инструменты форматирования, но код с отформатированным кодом значительно хуже (хотя и медленно улучшается). Я думаю, что это во многом связано с гораздо более сложным синтаксисом, с которым ему приходится иметь дело.

Зрелость и распад: причина, построенная на OCaml, имеет корни, которые вернулись более 20 лет. Это означает, что он имеет прочную основу, которая была проверена на битву и доказана, что она работает в течение длительного периода времени. Кроме того, это язык, который в значительной степени развивается учеными, что означает, что функция может занять некоторое время, чтобы получить возможность реализовать, но когда она попадает в нее, она прочная, потому что она обоснована теоретически и, возможно, даже официально доказана. С другой стороны, его возраст и экспериментальный характер также означают, что он собрал немного трещин, которые трудно избавиться.

С другой стороны, Элм, будучи относительно новым и менее бюрократически управляемым, может двигаться быстрее и не боится порвать с прошлым. Это делает более тонким и более последовательным, но также имеет менее мощную систему типов.

Переносимость: Elm компилируется в JavaScript, который сам по себе довольно портативен, но в настоящее время ограничен браузером и, тем более, архитектурой Elm. Это выбор, и было бы не слишком сложно ориентировать узел или платформы. Но аргумент против него, как я понимаю, заключается в том, что он отвлекает внимание, тем самым делая его менее превосходным в своей нише

Причина, основанная на OCaml, на самом деле нацелена на собственный машинный код и байт-код в первую очередь, но также имеет компилятор JavaScript (или два), который позволяет ему ориентировать браузеры, узел, электрон, реагировать на родной язык и даже способность компилировать в unikernel. Поддержка Windows, предположительно, немного отрывочная. В качестве экосистемы Reason нацеливается на Реагирование в первую очередь, но также имеет библиотеки, позволяющие использовать Elm Architecture вполне естественно

Управление: Elm разработан и разработан одним человеком, который способен четко сообщать о своих целях и аргументах и кто получает оплату для работы на нем полный рабочий день. Это обеспечивает согласованный и хорошо продуманный конечный продукт, но разработка идет медленно, а фактор шины может затруднить инвестиции.

История разума немного сложнее, поскольку это скорее название зонтика для коллекции проектов.

OCaml управляется, разрабатывается и разрабатывается на открытом рынке, в основном учеными, а также разработчиками, спонсируемыми различными фондами и коммерческими спонсорами.

BuckleScript, компилятор JavaScript, который происходит от компилятора OCaml, разработан одним разработчиком, чьи цели и ситуация с занятостью неясны и кто не удосуживается объяснить свои рассуждения или решения. Разработка технически более открыта в том, что PRs принимаются, но отсутствие объяснения и тупой кодовой базы делает ее эффективно закрытой. К сожалению, это не приводит к особенно согласованному дизайну, и фактор шины может также затруднить инвестирование.

Сама причина и ReasonReact управляется Facebook. PR приветствуются, и значительная часть развития Разума обусловлена аутсайдерами, но большинство решений, похоже, делается где-то в задней комнате. PR для ReasonReact, помимо тривиальных исправлений опечаток и т.д., Часто отвергаются, вероятно, по уважительной причине, но обычно с небольшим объяснением. После этого, как правило, из задней комнаты обычно появляется лучший дизайн.