1
これは基本的なocaml型の質問かもしれません。以下のコードのタイプをocamlのトップレベルから('a * 'a) list -> 'a list
とする方法を説明してください。ocaml型のコード例から、
let rec func lst = match lst with
|[] -> []
|h::t -> match h with
|(a,b) -> if (a = b) then a::(func t) else b::(func t);;
ありがとうございました。したがって、値は型aなので、リストがありますよね? –
さて、 'a'と' b'は同じ型でなければならないので、 'b'値も' a '型です。 'a'と' b'が同じ型を持たなければならない理由は、(1) 'a = b'という表現はこれを必要とします。 (b) 'if'の' then'ブランチとelse'ブランチは同じタイプでなければなりません。 –
私は、@ JeffreyScofieldのコメントは、GentleCoderの答えが少し誤解を招くかどうかを示していると考えています。 'h 'と'(a、b)'をマッチさせるだけでは、 a * 'a)list';コンパイラは、入力に '( 'a *' a)list'型があり、'( 'a *')型ではないことをコンパイラが知っているので、 'a = b'や' b)リスト。その最後の型 '( 'a *' b)list'は' 'a''と' 'b''が同じ型であることを必要としないものです。 – Mars