2017-10-03 7 views
0

私の新しいことをOCamlに許してください。しかし、私は2つのリストの交差を返す非常に単純な関数を持っていますが、同時に両方のリストに要素があるときだけです。 3行目では、「この式には 'a'型がありますが、式には 'a list'が期待されていますが、出力するリストではありません。これはなぜリストではありませんか?

let rec intersection (l1 : 'a list) (l2 : 'a list) : 'a list = match l1,l2 with 
    | [],[] -> []    (* empty lists *) 
    | [h1::t1], [h2::t2] -> (* non-empty lists *) 
     if h1 = h2   (* if both elements are the same *) 
     then h1 :: intersection(t1,t2) (* include in intersection response *) 
     else intersection(t1, t2)  (* else ignore it and check the remaining elements *) 
+0

すべてのアームは同じタイプを返す必要があります。 'else'式では、' intersection(t1、t2) 'は' a 'だけを返すことができます。機能の全体を投稿するとより役に立ちます。 – PieOhPah

+2

'intersection(t1、t2)'は、タプル '(t1、t2)'で 'intersection 'を呼び出します。それは '交差点t1 t2'と呼ばれるべきです。 – PieOhPah

+0

タイプエラーで何も変更されていないようです。引き続き この式のタイプは「aですが、式はタイプ です」リスト タイプ変数「リスト内で発生します」 – Swift142

答えて

1

表現a :: bは、その頭aとテールbであるリストです。したがって、表現[a :: b]はリストのリストです。あなたのパターンはh1 :: t1h2 :: t2になるはずです。

@PieOhPahが指摘するように関数全体を投稿すると、助けがはるかに簡単になります。

更新

あなたのコード内の少なくとも2個のエラーがあります。私はこの参照上で与えられたとして、私はあなたのコードをコンパイルする場合:私は[h1 :: t1], [h2 :: t2]からh1 :: t1, h2 :: t2にあなたのパターンを変更した場合

File "a1.ml", line 5, characters 13-15: 
Error: This expression has type 'a but an expression was expected of type 
    'a list 
    The type variable 'a occurs inside 'a list 

を、私はこれを参照してくださいので

File "a2.ml", line 5, characters 31-38: 
Error: This expression has type 'b * 'c 
    but an expression was expected of type 'a list 

この第二のエラーが発生しintersectionにあなたの再帰呼び出しタプルはintersection (a, b)です。しかし、intersectionはカレー化された形式で定義されています。すなわち、別の引数intersection a bを取ります。これは@PieOhPahが指摘しているものです。

私が両方の変更を行った場合、それ以上のタイプエラーは表示されません。他にもエラーがありますが、タイプエラーではありません。

+0

は全体の機能を追加しました。 OCamlは、リストをリストのリストにすることなく、括弧の中でリストを定義することを許可していないのですか? – Swift142

+2

リストには2つの表記法があります: '[a; b] 'と' a :: b :: [] 'である。あなたはこれらの表記法を組み合わせているので、リストのリストが得られます。 –

+0

@JeffreyScofieldの回答は十分明確です。 cons( '::')は既にリストを構築しています。つまり、角括弧なしで '(h1 :: t1、h2 :: t2)'にマッチさせる必要があります(括弧は分かりやすくするためです)。 – PieOhPah

関連する問題