web-dev-qa-db-ja.com

Webサービス用のHaskellとErlang

私は関数型言語を使用して実験的なプロジェクトを開始することを検討しており、ErlangとHaskellの間で決定しようとしています。どちらにも本当に気に入っている点があります。

Haskellの強力な型システムと純粋さが好きです。本当に信頼できるコードを簡単に書けると思います。そして、Haskellの力によって、私がやりたいことが簡単になると思います。

マイナス面では、HasellでWebを行うためのフレームワークの一部(Yesodなど)は、Erlangのカウンターパートほど高度ではないように感じます。

私はスレッドとフォールトトレランスに対するErlangのアプローチが好きです。 Erlangのスケーラビリティは大きなプラスになると私は感じています。

それが私の質問につながります。HaskellとErlangの両方にWebアプリケーションバックエンドを実装する上での人々の経験は何ですか。 Erlangにある軽量のスレッドとアクターのいくつかを提供するHaskellのパッケージはありますか?

29
Zachary K

私が持っている唯一の質問はあなたのウェブサービスが何をしているのですか? Webサービスが本当に機能上の問題である場合は、Haskellの方が適しています。

Erlangは必ずしも関数型言語ではありません。これは、超並列システム用の非常に強力な実行モデルを備えた手続き型言語です。これは通信業界向けに設計されており、Webサービス要求への応答に最適です。

手続き型プログラミングと関数型プログラミングの違いの概要については、 このページ *を参照してください。 (シアンページの醜い黒については、事前にお詫び申し上げます)。

Webサービスがかなりのパターンマッチングとルールの適用を行っている場合は、Haskellを選択します。おそらくすでに知っている言語とそれほど変わらないスケーラブルなインフラストラクチャが必要な場合は、Erlangを選択してください。

(* Waybackマシン経由のリンク。元のファイルは削除されています)

19
Berin Loritsch

あなたが言及している2つの間で、間違いなくHaskellは学術的であり、Erlangは実際の高スケーラビリティプロジェクトで使用されています。したがって、Webサービスの2つのうち、私はErlangを選択します。

しかし、私はあなたが3番目の選択肢を持っていると思います: Scala 、HaskellとErlangの両方に大きな影響を受けている言語。 TwitterやFoursquareのような一流のWebサービスを構築するために使用されます。 Lift もあり、RailsとDjangoに触発されたWebフレームワークですが、少し異なりますが、より機能的ですFoursquareはLiftを使用しています。

10
vartec

通常私は言う:「あなたの快適なゾーンから可能な限り物事を学びなさい、それはあなたが実際にそれを決して使わなくてもあなたをより良いプログラマーにするでしょう」。

この場合、それはおそらくHaskellを意味する可能性があります。しかしErlangはほぼ社会的に受け入れられるだけではありません。しかし、主要なポイント(軽いプロセス、メッセージパッシング、巨大なスケーラビリティ)は、他の多くの「実用的な」プラットフォームで行われるため、得られた教訓は、より「実際の」作業に大きく即時に適用できます。

私のアドバイス:それが楽しみのためなら、Haskellをやってください。トレーニングの場合は、Erlangにアクセスしてください。

6
Javier

Haskell(GHC)は、グリーンスレッド(Erlangの「プロセス」)を標準でサポートしています。たとえば、forkIOは新しい緑色のスレッドを生成し、そのスレッドIDを返します。

forkIO :: IO () -> IO ThreadId

メッセージ受け渡しメカニズムは、パッケージ distributed-process によって実装されていますが、十分に維持されていません。
Haskellのデータ共有メカニズムはErlangとは異なります。 Haskellは変更可能なグローバル状態の概念を採用し、抽象化を追加して安全に使用できるようにします。これの主な例はTVar([〜#〜] t [〜#〜]ransactioalVariable)構成可能なアトミックトランザクションを有効にします。
Haskellには、サーバントなどの表現型システム(依存型)を利用する非常に高レベルのWebサービスライブラリもいくつかあります。型の安全性を確保するためにコンパイル時に使用できる型レベルのDSLを使用して、REST APIを指定できます。

編集:
明らかに分散型クロージャは、staticptrを利用してクロージャのシリアル化も実装します

1
Poscat

Rust を検討することもできます。

  • 純粋に機能的ではありませんが、半機能的なスタイルを奨励します
    • 閉鎖
    • デフォルトの不変性
    • 強力で安全なマクロシステムを備えており、マクロを記述して(または既存のコミュニティ作成のものを使用して)より機能的なスタイルでコードを記述できます。
  • 抽象化のあらゆるレベルのライブラリ/フレームワークがあります
  • 効率的なメモリの安全性に重点を置いています
  • それは強い型システムを持っています
  • あらゆる種類の同時実行が本当に簡単になります(すべての安全要件を満たしている限り)。
  • 活動的なコミュニティが大きい
  • (あなたが言及した他のように)それはオープンソースです
  • 等.
0
Solomon Ucko