2010-12-20 31 views
5

タプルメンバーに関数引数として関数を適用する方法はありますか?そうでない場合は、任意の数の引数を持つ関数を作成し、その引数になるように、 "tail"に別の関数を適用することができますか?OCamlで展開できないタプル

答えて

7

一般的に、いいえ。 2つの引数の場合は、のcurryuncurry関数を使用できます。

printfの内部が行うように、Objモジュールで何かを調理することも可能かもしれないが、私は遠く離れているから滞在します。難しいのは、型システムが、一般化されたcurryまたはuncurry関数の型を表現する方法を提供していないということです。型システムでは、タプルの長さに渡って "計算"することはできません.2タプルは2タプルであり、(a*b*c)は実際には(a*b)であり、別のコンポーネントがあることを表現する方法はありません。 printfは、型を正しく動作させるためにコンパイラから特別なサポートを受けています。その結果、関数型は書式タイプの一部になります(タプルでは同様の解決策は機能しません)。

7

言語自体では、任意のサイズのタプルで関数を定義することはできません。

しかし、this folding techniqueに従うことで任意の数の引数で関数を定義することは可能です(SMLについてはそこに記述されていますが、OCamlでも同様に機能します)。

関連する問題