2009-05-29 1 views
1

これらは既に尋ねられている場合は私に他の答えを教えて自由に感じてください!基本的なF#質問:変更可能性、大文字小文字の標準、関数とメソッド

今月、新しいリリースで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です。誰が何をいつ使うべきかを明らかにするには気をつけてください。

ありがとうございます!

+0

正式な方針であるか、それとも常にそうなるかはわかりませんが、静的関数は小文字で始まり、メンバ関数は大文字で始まることがわかります。 – Benjol

答えて

5

可変性について:F#はあなたが実用的であることを可能にします。私はめったに変更可能/ refへの状態モナドを好むことはほとんどありませんが、あなたが好きなことをすることはできます。モナドは避けられませんが、明白な勝利を得るには(例えば、非同期プログラミング)、それらを使う傾向があると思います。

「関数は値です」という意味では、大文字のレットバインド関数に名前を付けることを選択できます(関数であり、関数は大文字で始まります)。小文字(let-bound値)です(ちょうどその型名に ' - >'があります)。個人的には、常に大文字の名前をすべての関数に使用することをお勧めしますが、特にF#ライブラリ自体のスタイルが過去1〜2年の間にゆっくりと進化/標準化しているので、両方のスタイルが見えます。アンダースコアは.Net全体で避けられているようで、F#ライブラリはもはや例外ではありません(アンダースコアを使用する名前がいくつか残っていますが、今は痛感していておそらく変更されます)。

機能のスタイルについて:私はあなたが何を求めているのか不明です。 List.mapの場合、 'List'はF#モジュールの名前であり、 'map'はそのモジュールの関数です。メンバ関数(str.Lengthなど)は.Net全体で広く使用されるという利点があり、エディタで素晴らしいインテリセンス体験を提供します。

+0

答えをありがとう。私は第三の質問が曖昧であることを知っています。私は、バランスがメンバ関数を持つ「主に」オブジェクトか、より「伝統的な」機能スタイルかどうかを疑問に思っています。 –

+1

「正常に見える」アセンブリを作成し、他の.Net言語で簡単に使用できるアセンブリを作成するには、コンポーネントをクラスにパッケージ化することをお勧めします。それとは別に、F#はかなり受け入れています。 C#やVBのように見える 'OO' F#コードだけでなく、ほとんどの機能、モジュール、たくさんのカリング、 '機能的な' F#コードの両方を見るのが一般的です。前者の場合、他の.Netコンポーネントが消費する機能を公開することを決定した場合は、通常、「機能ロジック」よりも薄い「オブジェクトファサード」を提供するのは簡単です。 – Brian

+0

クール、私は約それをクリアすると思います!私はそれが経験でより自然になると確信しています。私は機能的なものを作る能力はF#を何に設定するのかと思うので、おそらくそのスタイルに向かうだろうが、時には "純粋な"ものは(乱数のように)迷惑にならないということに同意する。 –

5

1)私はモナドが捨てられているとは言いませんが...あなたはハスケルの背景について言及していますので、F#のワークフローはあなたが調べたいものですビジネスプロセスのものとは少し関係があります)。一般に、シーケンス表現およびより一般的には計算式(a.k.aワークフロー)はモナドに近づくであろう。それを表現する方法が「好き」であるかどうかはわかりませんが、この変更はかなり一般的です。彼らはそれぞれの場所を持っています - 個人的には、「F#の財団」という2冊の本から始まりましたが、もしあなたが「エキスパートF#」に出向こうと思っているのであればどちらも良いです。正直言って、私は私が始めるのを助けるための基盤が必要でした。

2)私が経験したことでは、.NETの伝統的な関数は関数型プログラミングに実際には適していないというコンベンションを持っているという混乱があります。そのように、私はF#では、あなたが「従来の.NET」という名前の関数とF#の要素の使い分けを見ているときに、混乱が起こることがあると感じています。たとえば、上記の「エキスパートF#」の本では、CamelCaseとPascalCaseの両方でList.mapやDates.Todayなどの値を使用することがわかります(Pascalの場合は従来の.NETです)。経験則に従うなら、より伝統的な機能(camelCase)命名法を使用してください。ただし、作成しているものが他の.NET言語で使用されることが予想される場合は、.NETノルム(パスカル)。関数型の世界では、略語(itr、tblなど)の許容範囲がはるかに大きいことに注意してください。一般的に.NETがこれから離れるようになっています...これもまた、 F#で公開されている要素と.NETの全要素で共有されている要素を呼び出す場合に基づいています。

3)OOとファンクションスタイルの組み合わせが混乱する可能性があることに同意します。ここでも、F#(機能している)が機能的なパラダイムの点ではっきりとしていると言っている以上に、どちらが好ましいかはわかりません。しかし、F#は.NETの世界では機能的な言語です(上で言及した名前の相対的な混乱に気づく)...再び、完全に明確なカットではありません。

ホープが助けてくれるといいと思います。F#を使用していると信じていますし、C++やCなどの概念を共有している他の言語も考えています。私はF#が従来のプラットフォームで動作する関数言語であることを理解し始めました(相互運用性をシームレスにすることが適切であるとは確信していませんが、 D)

2

一般的に、モナド(F#の「ワークフロー」)はハスケルよりもはるかに稀です。まず可変変数が利用可能であるため、国のモナドを使用することはまずありません。第2に、より高級な型変数は存在しません。つまり、モナド上で動作するようにオーバーロードされたコードを書くことはできません。

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

+0

ああ、それは興味深いことです。実際にはモナドは実用的ではありません。 –

関連する問題