12

「Camlの紹介」は言います

Camlでは、タプルではなく、複数の引数の関数にカリー化された関数の定義を使用することをお勧めします。

'a -> 'b -> 'c呼び出し規約をと比較する場合'a * 'b -> 'c

SML / NJを使用するとき、入力と出力の両方にタプルタイプを使用することに慣れました。('a * 'b) -> ('c * 'd)したがって、タプルを使用して複数の入力を表現することは、複数の出力を表現する方法と対称に見えます。

タプル引数よりもOCaml関数宣言にカリー化が推奨されるのはなぜですか?カリー化/部分評価を可能にすることで得られる柔軟性が高いだけですか、それともOCamlコンパイラの実装の詳細から得られる他の利点がありますか?

4

3 に答える 3

8

私はそれの多くが慣習だと思います-OCamlの標準ライブラリ関数はカレーされていますが、標準MLではそれらは一般的にいくつかの高階関数を除いてはありません。ただし、言語に組み込まれている違いが1つあります。演算子(eg (*))はOCaml(eg int -> int -> int)でカレーされます。一方、それらはStandard MLではカレーされていません(たとえば、op*可能性があります(int * int) -> int)。そのため、組み込みの高階関数(foldなど)も、OCamlではカレーされ、StandardMLではカレーされていない関数を取ります。つまり、関数がそれと連動するためには、それぞれの規則に従う必要があり、そこからそれが続きます。

于 2012-05-20T08:27:11.777 に答える
5

はい、それは主に表記上の利便性と部分適用を行うための柔軟性です。カレー関数はOCamlでは慣用的であり、コンパイラーはそれらをタプル関数よりもいくらか最適化する可能性があります(SMLコンパイラーは通常タプル用に最適化します)。

タプリングの長所は、あなたが言及する引数/結果の対称性(これは関数を作成するときに特に役立ちます)とおそらく表記上の親しみやすさ(少なくとも非機能的な世界から来た人々にとって)です。

于 2012-05-19T16:34:02.013 に答える
3

OCamlの最適化についてのコメント。

OCamlでは、タプルを引数として渡すときに常にタプルが割り当てられることに気づきました。プライマリヒープへの割り当てがocamlで高速であっても、もちろん何もしないよりも長くなります。したがって、引数としてタプルを渡すたびに、タプルの割り当てと充填にいくらかの時間が費やされます。

私は、ocamlコンパイラがタプルを構築する必要がない場合を最適化すると予想していました。たとえば、呼び出された関数をインライン化する場合、タプルコンポーネントのみを使用でき、タプル自体は使用できません。したがって、タプルは無視できます。残念ながら、この場合、OCamlは役に立たないタプルを削除せず、割り当てを実行します。このため、コードのクリティカルセクションでタプルを使用することはお勧めできません。

于 2012-05-19T19:10:59.367 に答える