Haskell Language
関数呼び出しの構文
サーチ…
前書き
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
が関数であることを知っているので、引数b
とc
にそれを適用し、その結果を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
と同じです。つまり、関数addOne
とplus 1
は同一であり、 addOne
をplus 1
置き換えるだけで新しい関数を定義することを避けることができます。括弧を使用して、 plus 1
を部分式として分離することを忘れないでください。
map (plus 1) [1,2,3]