F#のOCamlへの変更[終了]


126

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


3
OCaml開発者の観点からのもう1つの比較なので、かなり偏っていますが、それでも有用です。
Mauricio Scheffer、

8
注意:この質問の運命に興味がある場合は、メタスタックオーバーフローに関する議論に参加するか、チャットで議論してください。ここのコメントは非常に非生産的だったため、削除しました。
Shog9

1
@MauricioSchefferリンク切れ!
JD 2012年

2
@JonHarrop このリンクは更新されたものかもしれないと思います。(中田恵子著)
Bart

回答:


89

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

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

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

理論的には、これらの機能を使用しないOCamlプログラムはF#でコンパイルできます。OCamlを学ぶことは、F#を完全に合理的に紹介することです(また、その逆も想像できます)。

違いの完全なリストはここにあります(注:デッドリンクのarchive.orgの置き換え)。


3
F#に相当するcamlp4はありますか?
nlucaroni 2008年

そう思わないでください。しかし、プログラムをcamlp4を介してF#コンパイラにパイプすることができます。(お勧めしません。)
Chris Conway

6
F#には名前付きとオプションの引数がありますが、構文とセマンティクスが異なります。F#でCamlp4を使用すると問題が発生します。これは、F#はほとんど常にインデントの影響を受けやすいため、新しいレクサーが必要になり、レクサーに関するCamlp4のドキュメントがほぼ2年間書かれていないためです。
JD

4
そして今、リンクは死んでいます。それはおそらく良いことだと思います。F#は2008年から改善されていると思います。

1
Microsoftがcamlp4のような機能をF#に追加したくないと聞いたところ、そのような機能が人々にMicrosoft Visual Studio以外の開発環境の使用を開始するのを促すのではないかと心配していました。
chrismamo1 2015年

118

この質問はしばらくの間回答されてきましたが、ほとんどの回答がF#でOCaml機能に欠けているものを示していることにかなり驚いています-これは、既存のOCamlプログラムをF#に移植したい場合に知っておくと良いでしょう(これはおそらくほとんどの参照記事の動機)。ただし、F#を別の言語にする多くの機能があります(.NETのOCamlの限定バージョンだけではありません!)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#を含めることはないと思います。


18
わあ!OCamlはメタプログラミング用に特別に開発されたものであり、そのコンテキストではF#や.NETよりもはるかに優れています。Camlp4はF#よりもはるかに強力な見積システムです。OCamlのレクサーとパーサーは、.NETで利用可能なものよりもはるかに優れています。また、アクティブなパターンと計算式を実装するCamlp4マクロも利用できます。OCamlには、Visual StudioがF#に対して行うのと同じ利点を提供するIDEもあります。
JD

4
F#の引用は、Camlp4で使用できるものとはまったく異なる目標を持っています(余談ですが、これはOCaml言語ではなく、その上にあるシステムです)。したがって、それらを比較するのは公平ではありません。Camlp4の存在は確かにOCamlの利点ですが、引用(WebSharper、GPUでF#を実行するなど)とは関係ありません
Tomas Petricek

12
@Tomas:Camlp4がバイナリレベルでOCamlと統合されており、実行中のOCaml REPLでオンザフライでCamlp4マクロを定義して使用できる場合、Camlp4はOCamlの「上のシステム」であるという主張をどのように調整しますか?Camlp4が引用メカニズムを提供するという事実と、Camlp4が「引用とは何の関係もない」というあなたの主張をどのように調整しますか?SkyDeckのocamljsツールが2007年以来Camlp4を使用して引用されたOCamlコードをJavascriptにコンパイルしているときに、Camlp4がWebsharperのようなものを促進できないという意味をどのように調整しますか?
JD

6
@Tomas:F#は<@ a @>、のようなバインドされていない変数を含む式を引用することもできません。タイプ定義<@ type t = int @>はもちろん、Camlp4のように拡張性の低いレクサーやパーサーを処理することもできません。まともなマクロシステムがないことは1つの欠点ですが、私見では、F#のまともなレクサーとパーサーがないことは、はるかに深刻な障害です。OCamlの優れたツールサポートの恩恵を受けるために、実際には開発者にOCamlを使用してレクサーとパーサーを作成し、F#がサポートするサブセットに制限し、F#に移植して戻すことをお勧めします!
JD

8
@エリック:「ほとんどの人はF#に欠けているものに焦点を当てていますが、OCamlに欠けているものも見たかったのです」。アクティブパターン、メタプログラミング、計算式、および非同期ワークフローは、F#になる前にOCamlで利用可能であったことに注意してください。
JD、

16

OCamlにはF#にはない多くの機能があるため、私は常にF#をOCamlの従兄弟として説明しています。F#は以前のCAML言語とより密接に関連しています。特に、F#は抽象化のサポートが非常に制限されており、構造型付け(OCamlのオブジェクトポリモーフィックバリアントなど)はまったくサポートされていません。

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

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

また、OCamlの素晴らしいモジュールシステムにより、型(データ構造など)を介してコードを簡単にパラメーター化できることを発見しました。さらに、エレガントにパラメーター化されたデータ構造を書き込もうとすると、F#コンパイラーで数十のバグに遭遇しました。これまで誰もこれを試みたことがないためです。F#stdlibには、優れたデータ構造の実装がいくつか含まれていますが、実質的に再利用されていません。つまり、カットアンドペーストの仕事です。


28
すべてのリンクには有料サブスクリプションが必要です。

2
@Jon Harropが自分で書いたもの(彼は毎回作者としてリストされています)の恥知らずなプラグインのようです
共生

@symbiontええ、私たちはそれが少しスパム行為であることを知っています。あなたが無料であったいくつかの追加情報にリンクした場合、いいでしょう。しかし、答えはリンクなしで結構ですので、あなたはそこにいます。

@いくつかの追加情報を自分でリンクするとよいでしょう
symbiont

@symbiont「あなた」と言ったとき、私はあなたではなくジョンを意味していました。それを読んで、奇妙に聞こえます。ジョンがインタースティシャルコメントを削除したかどうかは不明です。とにかく、ここに行きます:Meta Stack Exchange

9

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


2

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


1
「F#はOCaml構文を直接サポートします。100%互換ではないかもしれませんが、かなり近いと思います。」IME、F#コンパイラによるOCaml互換性のサポートは非​​常にバグが多いです。F#コンパイラは内部で有効なコードで停止するため、既存のOCamlコードベースをF#に移植することが困難になる可能性があります。
JD

すべてのリンクは無効です。
ウイングジャム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.