2017-11-04 2 views
2

2 개의 목록 ('a list'b list)이 주어진 두 개의 목록의 카디 전 곱인 ('a*'b) list을 반환하는 함수를 만들려고합니다. 나는 이것을 시도했지만, 대신 , 'b과 같음 'a list list을 얻는다. 그래서 누군가가 내가 틀렸고 OCaml이 'a list list을 묻는 이유를 말해 줄 수 있는지 묻습니다. 'a list.데카르트 제품 유형 오류

let lprod l1 l2 = 
let rec aux lista la lb = 
    match la,lb with 
     [],_ -> lista 
     |ha::ta,[] -> aux lista ta l2 
     |ha::ta,hb::tb -> aux (ha,hb) la tb 
in aux ([],[]) l1 l2;; 

답변

1

여기에 몇 가지 문제가있다 :

  1. 당신은 ([], [])의 초기 누적 기 값으로 aux를 호출하고 있습니다. 이것은 튜플 목록이 아닌 두 개의 목록으로 된 튜플입니다.
  2. 마지막 패턴 매칭 브랜치에서 을 반복적으로 (ha, hb)으로 호출합니다.이 튜플은 튜플 목록이 아닌 단일 튜플입니다.

아마도 초기 값을 1로 설정하고 비어있는 목록이어야하며, 합 (::)을 사용하여 2의 누적기에 터플을 추가하는 것이 좋습니다.

편집 : 여기에 구현의 고정 된 버전입니다 :

let lprod l1 l2 = 
    let rec aux acc la lb = 
    match la, lb with 
    | [], _ -> acc 
    | ha::ta, [] -> aux acc ta l2 
    | ha::ta, hb::tb -> aux ((ha, hb)::acc) la tb 
    in aux [] l1 l2;; 
+0

예 나는이 누적를 원하는,하지만 내가 대신 튜플의 목록 AUX IN 목록의 튜플에 대한 호출하는 방법? –

+0

@JulioVillanueva 작업 구현에 대한 업데이트 된 답변보기 – glennsl

+0

완벽하게 작동합니다. 그것은 내가 원하는 것을 되돌려 주므로, 다음과 같이 사용했습니다 : | [], _ -> rev acc 내가 필요한 것을 얻으려면, 감사합니다. –

관련 문제