2011-01-07 9 views
5

.NETクラスを使用した場合、我々は、我々はかっこが必要なのですF#のコンストラクタ構文

let foo = DirectoryInfo "boo" 

が、単一のパラメータを使用して、もう少し複雑な何かのように、単一のパラメータを渡すために括弧を必要としない場合があります... これが本当であるとき、誰も解析ルールを知っていますか?

答えて

4

F#では、すべての関数が単一のパラメータを取ります。これは、最初は少し混乱するかもしれません。なぜなら、2つ以上のパラメータを取るように見えるが、実際にはタプルである1つのパラメータを渡しているからです。このスタイルについての詳細情報については

let foo = DirectoryInfo "boo" //passing 1 argument 
let foo2 = DirectoryInfo ("boo") //passing 1 argument that is a tuple 
let foo3 = StringBuilder ("blah", 100) //passing 1 argument again 
let foo4 = StringBuilder "blah" 100 //does not compile 

Tuples on MSDNをチェックアウト:

は、ここで彼らは1つの以上のパラメータを取るように表示され、コンストラクタの簡単な例です。

今や、関数のように見える別のやや異なる方法が1つ以上の引数を取ることもあります。これはcurryingと呼ばれ、F#コードのみを扱うときによく見られます。ここにはquick exampleがあります。

+1

返信ありがとう、私はカッコ内のタプルを認識していますが、私はいくつかのケースで見た.netクラスは、そのパラメータを括弧で括る必要がある、その単一のパラメータでも、 IDisposableであり、新しい演算子を使用する必要があります。だから、新しいSomeDisposable(foo)のようなものはかっこが必要です – Alex

+0

正確ではないか分かりません。たとえば、 'FileSystemWatcher'ではこれがうまくコンパイルされます: ' let watcher = new FileSystemWatcher "blah" ' – wsanville

+0

クラスコンストラクタを呼び出すときに、多くのF#コードサンプルが常に括弧を使用することは注目に値するかもしれません。これは複数パラメータのクラスコンストラクタで必要ですが、特異クラスのコンストラクタコールは、大部分のMLファミリ言語で共通の、識別されたユニオンコンストラクタコールの典型的な形式のように見えます。 – pblasucci

関連する問題