web-dev-qa-db-ja.com

MLコードをF#に変換するにはどうすればよいですか?

最近、私は本Purely Functional Data Structuresを見つけました。この本のすべての例は、MLのHaskellバージョンとともに付録に記載されています。しかし、私は関数型パラダイムを持つ1つのプログラミング言語、F#しか知りません。少し調べたところ、F#はMLから派生したCAMLの.NETポートである(またはそうだった)ことがわかりました。 CAMLはMLの方言にすぎないとのことです。

それを考えると、MLの知識があまりなくてもMLをF#に変換することは可能ですか?言語との主な違いは何ですか?それとも、代わりにMLを学ぶだけが最善でしょうか。

5
Gulshan

私はここで私の本のコピーを見ています。F#に直接翻訳できないと思うのは、

  • いくつかの一般的なデータ型を記述するために使用される署名。
  • 彼が怠惰なアルゴに使用するカスタム表記。

どちらの場合も、F#を知っていて、本の意味を理解できる場合(コードをコピーして貼り付けるのではなく)、変換は非常に簡単です。


また、MLを理解しないことを恐れる必要はないと思います。私はそれをプログラムしたことがなかったが、しばらくしてスタイルに慣れ、その本をうまく通り抜けることができた。言語が非常によく似ているのは、これが関連する言語の小さなコーナーケースに依存しない教訓的な本であることを特に考慮していることです(MLは非常に堅固な小さな言語です!)。

2
hugomg

それを考えると、MLの知識があまりなくてもMLをF#に変換することは可能ですか?

この(極端な)ケースでは不可能だと思います。

言語との主な違いは何ですか?

このコンテキストの大きな違いは、F#にはMLのモジュールシステムのようなものがないことです。 F#には高次モジュールシステムがない(Okasakiは抽象化、構成、ブートストラップに効果を発揮するために広範囲に使用している)だけでなく、階層的なモジュールも備えていないため、抽象化が比較的劣っています。 .NETのOOPを使用できますが、OOPはMLのモジュールシステムと比べて非常に不十分です。

それとも、代わりにMLを学ぶだけが最善でしょうか。

岡崎の本の半分を理解したいのであれば、MLのモジュールシステムについて学ぶことをお勧めします。それ以外の場合は、純粋に機能的なデータ構造の根幹を知るために、低レベルのコード(強力な抽象化ではない)をMLからF#に変換できます。

5
Jon Harrop

あなたはF#が何であるかについて少しずれています。 F#はMLの.Netポートではなく、C#はJavaの.Netポートです。 F#はOCamlから多くを取得します(実際には、F#コンパイラを使用してほとんどのOCamlコードをコンパイルできます)。

F#は、.Netフレームワークを使用するために必要なため、OCamlよりも必須のアプローチを採用しています。

this SO post に基づいて、F#がサポートしていないOCamlがサポートしていないことを次に示します。

  • 関手
  • OCamlスタイルのオブジェクト
  • ポリモーフィックバリアント
  • camlp4プリプロセッサ
3
Jetti