2017-03-28 23 views
3

Haskell関数を呼び出すときに角かっこを使用する方法を覚えていません。私はCスタイルの背景から来て、私は関数を呼び出すためにf(comma, separated, args)の構文に慣れています。どうやらこれは(Haskellの)((((f) comma) separated) args)と同じですが、これはちょっと混乱しています。Haskell関数のコールバック

なぜこれらのすべての角かっこが必要ですか?

答えて

1

cスタイルの関数呼び出し構文に慣れていた場合、cスタイルの関数(例:

// defining the function 
int plus(int a, int b) 
{ 
    return a + b; 
} 

// elsewhere, calling the function 
plus(a, b); // brackets surrounding only the arguments, comma separated 

そして、同等のHaskellコードが

-- defining the function 
plus :: Int -> Int -> Int 
plus a b = a + b 

-- elsewhere, calling the function: 
(plus a b) -- brackets surrounding the function and the arguments, no commas 

f(comma, separated, args); 

これは

(f comma separated args) 

しかし、これらと同等になり、あなたの質問に例を使用することであろう括弧は必要ありません関数呼び出しが別の式に埋め込まれている場合を除いて、sary。 Haskellでは が、これはまた

((((f) comma) separated) args) 

と同等であるが、これらの余分な括弧は、彼らはちょうど(各機能は技術的に一つだけの引数を取る場合)Haskellは関数適用を扱う方法を強調表示し、いずれかの必要はありません。

f(comma)(separated)(args); 
5

それはHaskellの中括弧や関数呼び出しに関するルールを覚えておくのは簡単です::括弧はにしていないため、存在しない任意のものであるので、この最後の場合には、次のC関数呼び出しのようになります関数呼び出しを行う!

機能するための基本的な構文は、Haskellで呼び出すだけで、互いの隣に用語を記述することです:function argumentargumentを渡し、functionを呼んでいます。 Cのような構文では、それをfunction(argument)と書くでしょう。あなたのCの例f(comma, separated, args)は、Haskellでf comma separated argsと書かれています。

ハスケルは、高校数学で使用されている方法でのみ括弧を使用します。サブ式をグループ化して、異なる呼び出し構造を得るためです。たとえば、数学で1 + 2 * 3*を2と3で呼び出し、+を1に呼び出し、*コールの結果を呼び出します。 (1 + 2) * 3は、+が1と2で呼び出され、その結果で*が呼び出されるようにグループ化を変更します。同じものが有効なHaskell(とC)です。同じ意味ですが、このようなグループ化の括弧もグループ化に役立ちます中置演算子ではなく通常の関数での式。 f comma (separated args)はそれargs渡しseparatedを呼び出し、それcommaseparatedへの呼び出しの結果渡すfを呼び出すことを意味しながら、例えばf comma separated args、引数commaseparatedf、およびargsを呼び出します。

((((f) comma) separated) args)の必要はありません。実際には、にはのカッコを使用すると、f comma separated argsがどのように認識されるのかを説明した通りです。すべてのサブ式を明示的なカッコで囲んでいますので、実際にそれらのカッコがすべて必要であると言っているわけではなく、デフォルトが何であるかを示すためのあいまいさはありません。