3

私は主に関数型プログラミング言語について話している。たとえば、地図に関するウィキペディアの記事には、Haskell風の言語でこの例があります。

map square [1,2,3,4,5]

squareパーサー/コンパイラーは、関数自体を呼び出そうとせずに、関数をmap高階関数として渡したいことをどのように認識しますか?静的型付けを使用する言語の場合、式square [1,2,3,4,5]は明らかにコンパイルされませんが、コンパイラーは実際にそれを使用して、それが私が意図したものではないと判断しますか?

または、これはウィキペディアの悪い例であり、より良い例はmap &square [1,2,3,4,5](Cスタイルの関数参照を使用して)次のようになりますか?

4

3 に答える 3

5

まず第一に、関数適用が最も優先されます。したがって、パーサーが「マップ」に遭遇すると、最初の引数としてその右側にある最初のものを取ります。マップタイプは最初の引数として関数を想定しており、「square」は関数として定義されているため、タイプには互換性があります。マップスクエアは、数値のリストを期待する関数と考えることができます。

重要なのは、優先順位の規則に従って、型を調べ、引数の型を検証することです。

于 2011-08-24T03:53:20.750 に答える
4

解析の問題です。Haskellの関数適用は左結合であるため、ではなくmap square [1, 2, 3, 4, 5]として解析されます。((map square) [1, 2, 3, 4, 5])(map (square [1, 2, 3, 4, 5]))

于 2011-08-24T03:46:23.030 に答える
0

言語によって異なります。

たとえば、Javascript では、関数のf後に括弧を付けないだけで関数を参照できます。

ここで、f は関数ポインタとして扱われます。

map(f, [1,2,3,4,5]);

ここでは、関数呼び出しとして扱われます。

f([1,2,3,4,5]);

Scala では、規則はかなり複雑であり、関数を呼び出しているか参照しているかどうかをコンパイラが「推測」する余地があります。Scala メソッド呼び出しでの括弧の規則は何ですか? を参照してください。詳細な説明については。

于 2011-08-24T03:43:24.107 に答える