web-dev-qa-db-ja.com

OCamlへのF#の変更

F#はOCamlから派生していますが、欠落しているまたは追加されている主要なアイテムは何ですか?具体的には、OCamlの学習に利用できるリソースがF#を学習したい人にとっても有用かどうかについて興味があります。

123
Erik Forbes

主な違いは、F#がサポートしていないことです。

  • ファンクター
  • OCamlスタイルのオブジェクト
  • 多型バリアント
  • camlp4/5プリプロセッサまたは拡張ポイント(ppx)

さらに、F#には、ラベル付きパラメーターとオプションのパラメーターに対して異なる構文があります。

理論的には、これらの機能を使用しないOCamlプログラムはF#でコンパイルできます。 OCamlの学習は、F#の完全に合理的な入門書です(逆もまた同様です)。

相違点の完全なリストは here (注:archive.orgのデッドリンクの置き換え)です。

87
Chris Conway

この質問はしばらく前から回答されていますが、ほとんどの回答がF#にOCaml機能が欠けていることを示していることに非常に驚きました-これは、既存のOCamlプログラムをF#参照された記事のほとんどの動機)。ただし、F#を別の言語(OCaml for .NETの限定バージョンだけでなく!)にする多くの機能があります。ここにF#に追加されたものがいくつかあります。

  • 測定単位数値計算を処理するコードの型チェックを可能にします
  • メタプログラミング引用符を使用する(これにより、F#でLINQを使用できるようになり、WebSharperプラットフォームなどのプロジェクトの承認にも不可欠です)
  • アクティブパターン機能データ型の抽象化を作成します(より複雑なパターンマッチングアプリケーションでは一般的に非常に便利な機能です)
  • 計算式これは背後の言語機能です非同期ワークフロー(非同期I/O/Webサービス/ GUIプログラミング用のライブラリ)
  • 。NET互換オブジェクトシステム .NETプラットフォームとの完全な相互運用を可能にします(OCamlもオブジェクトをサポートしていますが、異なる-もちろん両方のシステムにいくつかの利点があります)。
  • オーバーロードされた演算子-私の知る限り、OCamlにはオーバーロードされた演算子はありません-F#では、すべての数値型とそれをサポートする型に+を使用できます。

そして、正直なところ、Visual Studio IDEに言及する価値があると思います。これは言語の一部ではありませんが、ユーザーエクスペリエンスを向上させます(Visual StudioでのIntelliSenseサポートは非​​常に優れています!)

リストを見ると、F#の人気に大きく貢献しているものがたくさんあるので、単なる「ファンクターなしのOCaml」以上のものです。 F#は間違いなくOCamlに基づいており(Haskellなどの他の言語のアイデアを取り入れています)、多くの側面を共有していますが、他にもたくさんあります。非同期ワークフロー、.NETスタイルOO、メタプログラミングなど)がなければ、Microsoft Developer DivisionはVisual Studio 2010にF#を含めないでしょう。

116
Tomas Petricek

OCamlにはF#にはない多くの機能があり、決して実現されることはないので、私は常にF#をOCamlのいとことして説明します。 F#は以前のCAML言語とより密接に関連しています。特に、F#では抽象化のサポートが非常に限定されており、構造型付けはサポートされていません(OCamlの objectspolymorphic variant など)。

一部の回答者が書いたことに反して、F#はラベル付き(「名前付き」)およびオプションの引数を(制限付きで)サポートしています。

ただし、これらはすべて高度な機能であり、OCamlに関するリソースを使用して、小規模なOCamlスタイルの関数型プログラミングの背後にある基本的なアイデアを確実に把握することができます。最初に発見する主な違いは、カプセル化や抽象化などの大規模な問題であり、OCamlとF#ではまったく異なる方法で解決されます。 F#でそれを行う方法を学びたい場合、利用可能な文献は 純粋に機能的なデータ構造に関するこの記事 のみです。

また、OCamlの素晴らしいモジュールシステムを使用すると、型(データ構造など)でコードを簡単にパラメーター化できることも発見しましたが、OOPの代替は恐ろしいだけでなく、。エレガントにパラメータ化されたデータ構造を書き込もうとすると、F#コンパイラで多数のバグが発生します。 「ジョブを貼り付けます。

16
Jon Harrop

F#とOCamlは、MLファミリーの言語の分類学上のクラスです。これには、他の奇妙な動物も含まれています。 F#はOCamlよりも新しく、ファンクター[モジュールの機能->モジュール]も行タイプ[オブジェクトクラスと多相バリアント]もまだありません。それらの間で、これらの2つの単純化は、おそらく.Netプラットフォームで開発している人にとって学習曲線を容易にします。悲しいことに、これらの2つの言語機能はOCamlで非常に強力であるため、OCamlの文献を読んでF#のコーディング方法に関する洞察を得ることは、おそらく両方が利用可能なC#の優れた代替手段であるF2の早期のフラストレーションにつながる可能性があります。

9
james woodyatt

F#はOCaml構文を直接サポートします。 100%互換性はないかもしれませんが、かなり近いと思います。

http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html

相違点のリストは次のとおりです(最新であるかどうかはわかりません)

http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html

2
Lou Franco