演算子l_op : A list * A list -> A list
を定義して、別の演算子を必要とする演算子op : A * A -> A
を定義します。 a0: A
の場合、a1 : A
op a0 a1
は常にA
として結果を返します。a1
の結果はとなります。は他のa1
より意味があります。OCamlで演算子の測定関数を定義します。
直感的l_op al0 al1
al0
の各要素に対して、op
に関して、al1
の有意義な要素を見つけに一致の戦略を必要とします。その後、op
の結果リストはl_op
の結果になります。
したがって、私はの意味がである必要があります。
可能な選択の1つは、機能measure: A * A * A -> int
を定義することができます。例えば、measure a0 a1 (op a0 a1)
は、op a0 a1
が意味をなす方法を表す1から10までのintを与えます。次に、l_op al0 al1
の実装では、がal0
の場合、a1
はmeasure a0 a1 (op a0 a1) >= measure a0 a1' (op a0 a1') for all a1' in al1
のようになります。整数演算は理にかなっている方法を表し、そして、私は私がop : A * A -> A * int
に少しop
を変更...
もう一つの選択である、二つのリストからa0
とa1
を削除し、2つのリストの残りの部分と一致します。次に、l_op al0 al1
の実装では、がal0
の場合、a1
のようにfor all a1' in al1, m1 >= m1' where (_, m1), (_, m1') = op a0 a1, op a0 a1'
が見つかります。
2番目の選択肢の利点は、op a0 a1
を実行しながら測定を計算できるため、いくつかのコードを保存できることです。欠点は、op : A * A -> A * int
の署名がop : A * A -> A
より格好悪いことです。
だから私の質問は以下のとおりです。
1)があり、おそらくh
ことによって開始機能を()測定のこの種の従来の言葉ですが、私はそれを忘れてしまった、誰もが思い出させるだろうか?
2)int
は測定に適したタイプですか?たぶん、そのタイプを定義することができます...最も一般的な方法は何ですか?
3)私が上記の選択肢はどれですか?それとも誰かが良いアイデアを持っていますか?