1

これらがすでに尋ねられている場合は、他の答えを私に指摘してください!

今月、新しいリリースでF#を開始します。私はOOと関数型言語(HaskellとSchemeですが、OCaml / MLではありません)の両方のバックグラウンドを持っています。F#CTPに付属している小さなチュートリアルを読むことから、これまでにいくつかの質問が発生しました。

1)可変変数はモナドよりも優先されますか?もしそうなら、モナドはF#で完全に避けられていますか?

2)使用されているキャピタライゼーションに少し混乱しています。このチュートリアルコードファイルでは、関数が小文字で始まる場合と大文字で始まる場合があります。MSは関数とメソッドの初期キャップを好む傾向があることは知っていますが、ここでは2つの方法があるようです。自分の時間で遊んでいるだけなので、大したことではありませんが、標準が何であるか興味があります。

3)OOと機能的なスタイルのこの全体の組み合わせについて私はかなり混乱しています。print_string "string"理にかなっていますが、ここにありますList.map fn list(Listが単なる名前空間でない限り、許してください)。次に、ここにありstr.Lengthます。いつ何を使うのか、そしてどれが好ましいのかを解明したいと思う人はいますか?

ありがとう!

4

3 に答える 3

5

可変性について:F#を使用すると、実用的になります。可変/参照よりも状態モナドを好むことはめったにありませんが、好きなように行うことができます。モナドは避けられませんが、人々は明確な勝利(非同期プログラミングなど)の場合にのみモナドを使用する傾向があると思います。

名前付けに関して:「関数は値である」という事実には緊張があります。つまり、let-bound関数に大文字(関数であり、関数は大文字で始まるため)または小文字で名前を付けることができます。 (これはlet-bound値であるため(タイプ名に「->」が含まれているだけです))。個人的には、すべての関数に常に大文字の名前を使用することを好みますが、両方のスタイルが表示されます(特に、F#ライブラリ自体のスタイルが過去1〜2年でゆっくりと進化/標準化されているため)。アンダースコアは.Net全体で避けられているようで、F#ライブラリも例外ではありません(アンダースコアを使用する名前はいくつか残っていますが、親指のように目立ち、おそらく変更されるでしょう)。

機能スタイルについて:何を求めているのかわかりません。List.mapの場合、「List」はF#モジュールの名前であり、「map」はそのモジュールの関数です。メンバー関数(str.Lengthなど)には、.Net全体で一般的に使用されるという利点があり、エディターで優れたインテリセンスエクスペリエンスを提供します。

于 2009-05-29T06:10:22.597 に答える
5

1) モナドが敬遠されているとまでは言いません... Haskell のバックグラウンドがあるとおっしゃっていたので、F# ワークフローを検討したいとおっしゃいました (ワークフローという用語は紛らわしいかもしれませんが、これらにはほんの少ししかありません)。ビジネスプロセスのものを扱うため)。一般に、シーケンス式とより一般的な計算式 (別名ワークフロー) はモナドに近いものになります。つまり、「優先」がそれを表現する方法になるかどうかはわかりませんが、ミュータブルはかなり一般的です。それぞれに場所があります。個人的には、2 冊の本から始めました。「Foundation of F#」ですが、詳しく知りたい場合は、「Expert F#」に進んでください。どちらも優れています。正直なところ、始めるには財団が必要でした。

2) 私が経験した中で混乱しているのは、.NET の従来の関数には、実際には関数型プログラミングに適していない規則があるということです。そのため、F# では、'従来の .NET' という名前の関数と、明らかに機能する F# の要素の使用法を見ていると、混乱することがあると思います...たとえば、上記の本で「Expert F#」 - 彼らは、キャメルケースとパスカルケースの両方で List.map や Dates.Today などの let 値が表示されると述べています (パスカルケースはより伝統的な .NET です)。経験則としては、関数型の世界にとどまっている場合は、より伝統的な関数型 (camelCase) の命名を使用します。ただし、作成しているものが他の .NET 言語で使用されることが予想される場合は、より多くの .NET を使用してください。ノルム(パスカル)。

3) OO スタイルと関数スタイルの組み合わせが混乱を招く可能性があることに同意します。繰り返しになりますが、F# (関数型であること) が関数型パラダイムの観点から明確にスタイルを設定していると言う以外に、どちらが好ましいかはわかりません。ただし、F# は .NET の世界では関数型言語です (前述の名前付けの相対的な混乱に注意してください)。繰り返しますが、完全に明確ではありません。

これが役に立てば幸いです...信じられないかもしれませんが、F# を使用していて、C++ と C の概念を共有している他の言語 (たとえば) を考えると、簡単になります。個人的には、F# は従来のプラットフォーム上で動作する関数型言語であり、相互運用するように作られていることを理解し始めたときに、命名が意味をなすようになり、概念が機能し始めました (ただし、相互運用をシームレスと呼ぶのが適切かどうかはわかりませんが: D)

于 2009-05-29T06:50:08.450 に答える
2

一般に、モナド (F# の「ワークフロー」) は Haskell よりもはるかにまれです。第一に、変更可能な変数が利用可能であるため、代わりに状態モナドを使用することを選択する可能性は低いからです。第 2 に、より高次の型変数が存在しないため、オーバーロードされたコードをモナドで動作させることはできず、それらを使用する魅力が大幅に低下します。

それらが一般的に使用される場所の 1 つは、シーケンス式です (Haskell のリスト内包表記によく似ていますが、それらはリスト モナドと密接に関連しています)。

于 2009-05-29T07:22:40.257 に答える