web-dev-qa-db-ja.com

ReasonML vs Elm

私はこれを見ました ReasonML vs TypeScript ここStackOverflowでの質問、今私はReasonMLとElmが互いにどのように比較するのか疑問に思っています。

それらの類似点と相違点は何ですか?いつどれを使うべきですか?一方が他方より優れている点は何ですか?

25
John Paul Ada

私はElmに精通していませんが、少し調べましたが、Reasonにはかなり精通しているので、試してみましょう。ここには間違いがあると思いますので、実際に私が言うことは何も受け取らないでください。あなたにとって重要な場合は、より詳細に自分自身を調べるためのポインタとして代わりに使用してください。

ElmとReasonはどちらも、プログラミングモデルが非常に似ているMLに似た言語なので、違いに焦点を当てます。

Syntax:Elmは、ElmとReasonの両方が使用するプログラミングモデル用に設計(および/または進化)されたHaskellのような構文を使用するため、非常に機能するはずです慣れ親しんだイディオムコードの読み取りと書き込みに適していますが、ほとんどのプログラマーにとっては非常に異なっており、馴染みがないように見えます。

Reasonは、JavaScriptの構文を可能な限りエミュレートすることで、より親しみやすいものにしようとします。これは、ほとんどのプログラマーによく知られています。ただし、基礎となるOCaml言語の機能セット全体をサポートすることも目的としているため、一部の機能パターンが非常に厄介になります。

この一例は、関数アプリケーションの構文です。これは、Elmで関数のカリー化された性質(_f a b_)を強調し、関数の構成と読み取り可能なDSLの構築に非常に適しています。 Reasonの括弧で囲まれた構文(f(a, b))は、この複雑さを隠します。これにより、簡単にアクセスできます(もちろん、下の方がまだ違いますので、誤ってトリップするまで)が、関数の構成を多用します括弧。

可変性:エルムは純粋に機能的な言語であり、理論的には優れていますが、周囲の世界はエルムの純粋さの探求にほとんど関心がないため、実際には挑戦的です。これに対するElmの好ましい解決策は、問題のあるコードをJavaScriptで代わりに記述して不純物を分離し、Webコンポーネントまたはポートを介してElmでアクセスすることです。つまり、別の非常に安全でない言語で大量のコードを維持し、それらを接続するためのかなりの定型句を保持する必要があります。また、ポートなどの四角い穴を通して丸いものを合わせる方法を理解する必要があります最初の場所。

一方、理由は... pragmaticです。生産性の向上と短期的な利益のために、安全性、理想、および長期的な利益を犠牲にします。 Reasonで不純物を分離することは依然として良い習慣ですが、物事を成し遂げるためだけにショートカットを避けられないことは避けられません。

しかし、たとえすべての不純性を分離するのに十分な規律を課せられたとしても、言語に変異を持たせるにはまだ費用がかかります。その価格の一部は、いわゆる 値制限 であり、遅かれ早かれ、これはコードを拒否するため、混乱させたり怒らせたりすることになります。コンパイラは、ある時点で変更可能な参照が関与できないことを証明できないからです。

JavaScriptの相互運用性:上記のように、Elmは、意図的にかなり制限されているポートおよびWebコンポーネントを介してJavaScriptと相互運用する機能を提供します。以前はネイティブモジュールを使用できたため、柔軟性が向上し(足元で撃つことができます)、その可能性はなくなりました(少なくともプレブスにとっては)、議論の余地のない動きです(しかし、哲学を考えれば、それほど驚くべきことではないはずです)。 この変更の詳細はこちら

Reason、またはむしろBuckleScriptは、JavaScriptに直接バインドできる豊富なプリミティブセットを提供し、非常に多くの場合、グルーコードを記述することなく慣用的なReasonインターフェイスを生成します。あまり直感的ではありませんが、一度理解すれば非常に簡単です。しかし、それを間違えて、後でランダムな時点で顔に吹き飛ばしてしまうことも簡単です。 Niceの慣用的なAPIを提供するために記述する必要があるグルーコードは、安全でないJavaScriptを記述する代わりに、Reasonですべての安全性を保証して記述できます。

Ecosystem:ElmのJavaScript相互運用性の制限の結果として、エコシステムはかなり小さくなります。 Webコンポーネントを提供する良質のサードパーティのJavaScriptライブラリはそれほど多くありません。自分でそれを行うには多大な労力が必要です。そのため、代わりにライブラリがElm自体に直接実装されているのがわかります。これはもちろん、さらに手間がかかりますが、Elm用に特別に設計されているため、品質が向上することがよくあります。

ツーリング:Elmは素晴らしいエラーメッセージで有名です。大部分の理由はそうではありませんが、努力しています。これは、Reason自体がコンパイラーではなく、OCamlコンパイラーの上に構築されているため、少なくとも部分的には、利用可能な情報が制限され、起こりうるエラーの表面積が非常に大きいためです。しかし、彼らはよく考えられていません。

Elmには、すべてをセットアップし、公開するパッケージのインターフェイスが変更されたかどうか、バージョンバンプがセマンティックバージョニングに対応しているかどうかをチェックする優れたパッケージ化ツールもあります。 Resaon/BuckleScriptはnpmを使用するだけで、_bsconfig.json_を新しい依存関係で更新するなど、Reason/BuckleScript固有のすべてを手動で管理する必要があります。

しかし、Reason、BuckleScript、そのビルドシステム、およびOCamlはすべて非常に高速です。すべての依存関係を含め、ゼロからコンパイルするのに3秒以上かかるプロジェクトはまだ経験しておらず、通常、インクリメンタルコンパイルは数ミリ秒しかかかりません(ただし、これは完全に使いやすさを犠牲にしているわけではありません)。私が理解しているように、エルムはそれほどパフォーマンスが良くありません。

ElmとReasonの両方にフォーマットツールがありますが、Reasonでフォーマットされたコードの品質は著しく低下します(ただし、徐々に改善されます)。これは主に、非常に複雑な構文を処理する必要があるためだと思います。

成熟度と衰退:OCamlで構築されている理由は、20年以上前に遡ります。これは、長期にわたって動作することが実証され、実証されている強固な基盤を備えていることを意味します。さらに、それは主に学者によって開発された言語です。つまり、機能が実装されるまでに時間がかかる場合がありますが、理論に基づいており、正式に証明されている可能性があるため、機能が組み込まれると堅実になります。マイナス面としては、その年齢と実験的な性質は、取り除くのが難しい少しの粗雑なものを集めたことを意味します。

一方、ニレは比較的新しく、官僚的に管理されていないため、より速く動くことができ、過去との対立を恐れません。これにより、よりスリムで一貫性のあるものになりますが、型システムもそれほど強力ではありません。

移植性:ElmはJavaScriptにコンパイルされます。JavaScriptはそれ自体非常に移植性がありますが、現在はブラウザに、さらにElmアーキテクチャに制限されています。これは選択肢であり、ノードまたはプラットフォームをターゲットにするのはそれほど難しくありません。しかし、それに対する議論は、私が理解しているように、焦点をそらすことにより、そのニッチでそれをあまり優れていないものにするということです

OCamlをベースにした理由は、実際には最初にネイティブマシンコードとバイトコードをターゲットにしていますが、ブラウザー、ノード、エレクトロン、ネイティブに反応し、 unikernel にコンパイルします。 Windowsのサポートは、おそらく少し大雑把です。生態系として、ReasonはReact何よりもまずをターゲットにしていますが、 Elm Architectureを非常に自然に使用できるようにするライブラリも持っています

ガバナンス:エルムは、自分の目標と推論を明確に伝えることができ、フルタイムで作業するために支払われている一人の人によって設計および開発されています。これにより、一貫性のある適切に設計された最終製品が作成されますが、開発は遅く、バスの要因により投資が困難になる可能性があります。

Reasonのストーリーはもう少し複雑です。プロジェクトのコレクションの総称であるためです。

OCamlは、主に学者によってだけでなく、さまざまな財団や商業支援者によって後援されている開発者によってもオープンに管理、設計、開発されています。

BuckleScript、OCamlコンパイラーから派生したJavaScriptコンパイラーは、目標と雇用状況が明確ではなく、理由や決定を説明することを気にしない単一の開発者によって開発されています。 PRは受け入れられるという点で、開発は技術的にはよりオープンですが、説明と曖昧なコードベースが不足しているため、開発は事実上閉鎖されています。残念ながら、これは特に一貫性のある設計にはなりません。また、バスの要因により、ここでも投資が難しくなる可能性があります。

Reason自体、およびReasonReactは、Facebookによって管理されます。 PRは歓迎され、Reasonの開発の大部分は部外者によって推進されていますが、ほとんどの決定はどこかの奥の部屋で行われるようです。些細なタイプの修正などを超えたReasonReactへのPRは、おそらく正当な理由のために拒否されますが、通常はほとんど説明がありません。その後、通常、後の部屋からより良いデザインが現れます。

70
glennsl