これは未解決の質問ですが、私を満足させる解決策を見つけることは決してできませんでした。代数データ型のパターンマッチング
のは、私は、この代数的データ型を持っているとしましょう:
今type t = A of int | B of float | C of string
、のは、私はcompare
機能を書きたいとしましょう - 私は例えば、Map
で私の値を置きたいので - 私が書きたいです
let compare t1 t2 =
match t1, t2 with
| A x, A y -> compare x y
| A _, _ -> -1
| _, A _ -> 1
| B x, B y -> compare x y
| B _, _ -> -1
| _, B _ -> 1
| C x, C y (* or _ *) -> compare x y
それとも私はこのようにそれを書くことができます:それはこれを好き
let compare t1 t2 =
match t1, t2 with
| A x, A y -> compare x y
| B y, B x -> compare x y
| C x, C y -> compare x y
| A _, _
| B _, C _ -> -1
| _ -> 1
私が間違っていない場合、n
がコンストラクタの数であると言うと、最初のcompare
は3 * (n - 1) + 1
のケースを持ち、2番目のものはn + ((n - 2) * (n - 1))/2 + 2
のケースを持ちます。
これは非常に不満足であるので:
n = 3
(我々の場合):7または6例n = 4
:10または8例n = 5
:13または13例
それはかなり速く成長する。
私はそうやっているのですか他の方法を使用していますか?
または、より良い、
let compare t1 t2 =
match t1, t2 with
| c1 x, c2 y ->
let c = compare c1 c2 in
if c = 0 then compare x y else c
など何かをする可能性があるので、
let compare (c1 x) (c2 y) =
let c = compare c1 c2 in
if c = 0 then compare x y else c
編集:追加した2つのコンストラクタはセニョールDrup(from Guadalup用等しいかどうかを比較します。 -P)
あなたの比較関数が間違っていることを除いて、 'A 1'と' A 2'は等しいと言えるでしょうから。 – Drup
はい、これは問題ではありませんが、心配しないでください。 「間違っている」というのはただの視点に過ぎません;-)私はあなたを喜ばせるために私の質問を編集しました;-) – Lhooq