サーチ…


前書き

Haskellの関数呼び出し構文は、適用可能なCスタイル言語との比較で説明されています。これは、Cスタイルの言語の背景からハスケルに来る人々を対象としています。

備考

一般的に、Cスタイルの関数呼び出しをHaskellに変換する規則は、任意のコンテキスト(代入、戻り、または別の呼び出しに埋め込まれています)では、Cスタイルの引数リストのコンマを空白で置き換えて、関数名とそのパラメータを含むCスタイルの呼び出しの括弧。

いずれかの式がかっこで包まれている場合、式の意味には影響しないので、これらの(外部の)括弧のペアを読みやすくするために削除することができます。
括弧を削除できる他の状況もありますが、これは可読性と保守性にのみ影響します。

基本関数呼び出しのかっこ

Cスタイルの関数呼び出しの場合、例えば

plus(a, b); // Parentheses surrounding only the arguments, comma separated

その後、同等のHaskellコードが

(plus a b) -- Parentheses surrounding the function and the arguments, no commas

ハスケルでは、関数適用のために括弧が明示的に必要とされず、数学のように式をあいまいにするためにのみ使用されます。したがって、ブラケットが式内のすべてのテキストを囲む場合は、実際にはカッコは不要であり、以下も同じです。

plus a b -- no parentheses are needed here!

Cスタイルの言語では、関数

組み込み関数呼び出しのかっこ

前の例では、ステートメントの意味には影響しなかったので、括弧を必要としませんでした。しかし、以下のようなより複雑な表現ではしばしば必要です。
C:

plus(a, take(b, c));

ハスケルではこれは次のようになります:

(plus a (take b c))
-- or equivalently, omitting the outermost parentheses
plus a (take b c)

これは以下と同等ではないことに注意してください。

plus a take b c -- Not what we want!

コンパイラはtakeが関数であることを知っているので、引数bcにそれを適用し、その結果をplus渡すことを知ることができます。
しかし、Haskellでは、関数は引数として他の関数を取ることが多く、実際の関数と他の値との間の区別はほとんどありません。したがって、コンパイラは、 takeが関数であるため、単にあなたの意図を仮定することはできません。

したがって、最後の例は、次のC関数呼び出しに似ています。

plus(a, take, b, c); // Not what we want!

部分的なアプリケーション - パート1

Haskellでは、関数を部分的に適用することができます。すべての関数が単一の引数をとり、その引数が一定である変更された関数を返すものと考えることができます。これを説明するために、関数を次のように囲むことができます。

(((plus) 1) 2)

ここで、関数(plus)1適用され、関数((plus) 1)2に適用され、関数(((plus) 1) 2)plus 1 2は引数をとらない関数なので、単純な値と考えることができます。しかし、Haskellでは、関数と値の区別がほとんどありません。

より詳細に説明すると、関数plusはその引数を追加する関数です。
関数plus 1は、その引数に1を加える関数です。
関数plus 1 2は、 1から2を加算する関数であり、常に3ます。

部分的なアプリケーション - パート2

別の例として、関数と値のリストを取り、その関数をリストの各値に適用する関数mapがあります。

map :: (a -> b) -> [a] -> [b]

リスト内の各値をインクリメントしたいとしましょう。独自の関数を定義して引数に1を加え、その関数をあなたのリストにmapすることもできます

addOne x = plus 1 x
map addOne [1,2,3]

addOneの定義をaddOne見て、強調のためにカッコが追加されていれば:

(addOne) x = ((plus) 1) x

任意の値xに適用されるaddOne関数は、部分的に適用された関数plus 1 x適用されるplus 1と同じです。つまり、関数addOneplus 1は同一であり、 addOneplus 1置き換えるだけで新しい関数を定義することを避けることができます。括弧を使用して、 plus 1を部分式として分離することを忘れないでください。

map (plus 1) [1,2,3]


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow