OCamlでは、パターンマッチング中にデータコンストラクタの勇気に名前をバインドできますか?実例として、私は以下のOCamlのプログラムがあるとします。OCamlで一致する合計型のバインディング名
type t = A of int * int | B of int * int
let sum_pair (a, b) = a + b
let f x = match x with
| A (a1, a2) -> sum_pair (a1, a2)
| B (_, b) -> b
let _ = Printf.printf "%d\n" (f (A (1, 2)))
これはコンパイルが、それは私がsum_pair
にそれを渡すためにマッチング後のタプル(a1, a2)
を再構築する必要があることを、むしろ迷惑なんです!代わりに、私は
let f x = match x with
| A (_ as pair) -> sum_pair pair
| B (_, b) -> b
を書くことができるようにしたいが、これは失敗すると、「エラー:コンストラクタAは2引数(複数可)を想定していますが、1つの引数(複数可)にここで適用されます」これは全体の値ではなく、ペア内にpair
をバインドするよう
let f x = match x with
| A _ as pair -> sum_pair pair
| B (_, b) -> b
を書くことは、何より良いではありません。 "これは式t型ですが、式はint * int型の式が必要です。"
これはBDFLの発言です:http://caml.inria.fr/pub/ml-archives/caml-list/1997/01/f8f69190c168ae796d3a16ed0e0dfa92.en.html – ivg
また、コメントとして正当な理由で言語があなたに抵抗していることに注意してください。それは実際にあなたに何か間違っていることを伝えようとしています。あなたがそれを適用するたびに、新しいペアを作成する必要があるので、カルト関数を作成する正当な理由はありません。だから、あなたは 'sum_pair'にひどいオーバーヘッドがあります。より良いバージョンは: '| A(x、y) - > sum_pair x y' – ivg