2017-10-03 2 views
0

OCaml에 대한 나의 새로운 점을 용서하십시오. 그러나 두리스트의 교차를 반환하는 매우 간단한 함수를 가지고 있습니다. 세 번째 줄에는 "이 표현식에 'a type이 있지만 목록에'표현식이 있어야합니다. '라는 출력이 있지만 목록이 아닙니다.왜이 목록이 아닌가요?

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'을 호출합니다. 그것은'intersection t1 t2'라고 불려야합니다. – PieOhPah

+0

유형 오류가있는 것으로 변경되지 않는 것 같습니다. 여전히 얻을 이 표현식에는 'a 표현식이 있어야합니다. 형식은 '입니다. 유형 변수 '는 목록 내부에서 발생합니다' – Swift142

답변

1

발현 a :: b 누구 a 머리를하고 그 꼬리 b 인리스트이다. 그러면 표현식 [a :: b]이 목록의 목록입니다. 패턴이 h1 :: t1h2 :: t2 일 가능성이 큽니다.

@PieOhPah가 가리키는대로 전체 기능을 게시하면 훨씬 쉽게 도움이됩니다.

업데이트

코드에서 적어도 두 가지 오류가 있습니다. 나는이 볼 위에서 주어진 난 당신의 코드를 컴파일하는 경우 : 나는 [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

목록에는 두 가지 표기법이 있습니다.'[a; b]'와'a :: b :: []'로 구성됩니다. 이 표기법을 조합하여 목록 목록을 얻습니다. –

+0

@ JeffreyScofield 대답은 충분히 명확합니다. cons ('::')는 이미리스트를 구성합니다. 즉,'(h1 :: t1, h2 :: t2)'와 대괄호 (''괄호 '는 명료하게하기 위해서)와 일치해야한다는 뜻입니다. – PieOhPah

관련 문제