2017-06-01 5 views
2

私はf#について学んでいます。関数を呼び出すときにかっこを使用する必要はないことを理解しています。私は第二の機能に括弧を使用しなければならないのはなぜf#で関数を呼び出すときにカッコを使用する場合は?

this.GetType() 

let addOne arg1 = 
    arg1 + 1 

addOne 1 

+2

[F#のカッコの使い方]の可能な複製(https://stackoverflow.com/questions/8222759/usage-of-parenthesis-in-f) – clcto

答えて

8

.NETライブラリでの作業とF#ライブラリでの作業の間には、パラメータに関しては少し相違がありますが、()はかっことしてではなく、「no」を意味する特殊な値unitとして表示されます有用な情報"。

これは、あなたが言うとき意味:

addOne 1 

あなたが値をaddOneを呼び出している - 数1 - パラメータとして。さて、あなたは第二の例に同じ読み適用する場合: - パラメータとして特別()単位値

this.GetType() 

をあなたは値をthis.GetTypeを呼び出すと、これを読むことができます。あなたは一貫してしたい場合、あなたはあまりにもスペースでこれを書くことができます:.NETライブラリを呼び出すとき

this.GetType() 

実際には、ほとんどの人は、スペースを省略します。スペースを書き込まないと、F#はメソッド連鎖もサポートします。 foo().bar()

複数のパラメータを取得するF#関数の多くは、 "カリー化"フォームを使用します。つまり、パラメータをスペースで区切る必要があります。たとえば:コンパイラは、コードを解析する方法を知っているように、ここで

let add a b = a + b 
let mul a b = a * b 

add 10 (mul 20 3) 

、あなたは、第二の式を括弧で囲む必要があります。これは、タプルとしてパラメータを取る典型的な.NETメソッドとは対照的です。あなたは、これは実際には.NETで知っているので、一般的にあなたがここにスペースを記述しないだろう、再び

some.Operation (10, "Hello") 

:F#のタプルは(10, "hello")として書かれているので、あなたはタプルを受け入れて通常の呼び出しとメソッド呼び出しを見ることができますメソッド呼び出しではなく、「タプルを関数に渡す」のではなく、概念的には両方の方法で考えることができます。

これは要約です - メソッドコールがタプルのように実際に動作しないコーナーケースがいくつかあります(名前付きパラメータの場合など)。しかし、このような考え方では、 。

+1

私はそれを引数としてタプルを渡すものと考えています。概念的にだけでなく、技術的にも、それはほとんどの場合、ファサード上のものです。舞台裏だけがそうではありません。これを実証するために、引数 - タプル - を別の "let"ステートメントで作成し、次のステップでタプルの識別子を関数またはメソッドの引数として使用することができます。私はこれをかなり簡単に数回見つけました。そして、間違いなくあなたはC#では使えないトリックです。 –

+1

トマース、この質問はちょうど氷山の先端、または象の片足です。ほとんどすべての新規参入者はこれらの問題につきものになり、大きなイメージを見ることができません。誰かが引数、カリー、タプル、ユニットについて説明する記事を書く必要があります。どのように相互接続されているのですか?それを目立つ場所に投稿してください。 –

関連する問題