2017-06-25 12 views
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);; 

答えて

4

コードの種類を1つ1つ確認してみましょう。最初の行では、コード内のfuncは関数の名前を表し、lstはタイルリストです。lstとの一致を使用し、[]->[](a,b)->を取得し、a = b(aとbは同じタイプです。これは前に指摘していただきありがとうございます)ので、('a*'a) list。では、func関数の出力を調べてみましょう。 4行目では、自体を再帰的に呼び出し、その戻り値は::の定義によってxが値であり、yx::yのリストであるためリストになります。 ocamlのリストは同種であるため、リストのタイプは値aと同じになります。値aの値は、aの値が(a,b)であるため、'aです。したがって、タイプは('a * 'a) list -> 'a listです。

+0

ありがとうございました。したがって、値は型aなので、リストがありますよね? –

+4

さて、 'a'と' b'は同じ型でなければならないので、 'b'値も' a '型です。 'a'と' b'が同じ型を持たなければならない理由は、(1) 'a = b'という表現はこれを必要とします。 (b) 'if'の' then'ブランチとelse'ブランチは同じタイプでなければなりません。 –

+0

私は、@ JeffreyScofieldのコメントは、GentleCoderの答えが少し誤解を招くかどうかを示していると考えています。 'h 'と'(a、b)'をマッチさせるだけでは、 a * 'a)list';コンパイラは、入力に '( 'a *' a)list'型があり、'( 'a *')型ではないことをコンパイラが知っているので、 'a = b'や' b)リスト。その最後の型 '( 'a *' b)list'は' 'a''と' 'b''が同じ型であることを必要としないものです。 – Mars