2012-02-09 2 views
2

가능한 중복 :
F# - cross product of two lists
Projecting a list of lists efficiently in F#직교 제품이 개 목록

나는 두 개의 정수리스트를 받아 모든 직교 제품을 하나의 목록을 반환하는 기능을 가지고있다. 나는 올바른 생각을 갖고 있지만 올바른 구현이 아니라고 생각합니다. 포인터 좀 줄까?

let rec cartesian = function 
| ([],[]) -> [] 
| (xs,[]) -> [] 
| ([],ys) -> [] 
| (x::xs,ys) -> List.map(fun y -> (x,y)::[]) cartesian (xs,ys) 
+0

이 사건을 처리하는 코드를 언급하지 않기 : 당신이 생각을 이해하면

let rec cartesian xs ys = match xs, ys with | _, [] -> [] | [], _ -> [] | x::xs', _ -> (List.map (fun y -> x, y) ys) @ (cartesian xs' ys) 

, 당신은 상위 기능 List.collect 완벽하게 작업을 일치하는지 볼 수 있습니다 이미 FSSnip에 있습니다. –

답변

6

이 빠른 수정은 다음과 같습니다

let rec cartesian = function 
| ([],[]) -> [] 
| (xs,[]) -> [] 
| ([],ys) -> [] 
| (x::xs, ys) -> (List.map(fun y -> x,y) ys) @ (cartesian (xs,ys)) 

아이디어는 각 요소 x와 함께, 당신은 목록 [(x, y1); (x, y2); ...; (x, yn)]를 생성하고 모두 해당 목록을 연결한다는 것입니다.

함수에서 첫 번째 패턴 일치 사례는 중복됩니다. 그리고 논쟁은 카레트 형태에 더 편리합니다. 이 기능은 다음과 같을 수 있습니다 :

let cartesian xs ys = 
    xs |> List.collect (fun x -> ys |> List.map (fun y -> x, y)) 
+0

이 부분을 설명해 주실 수 있겠습니까? List.map (fun y -> x, y) ys) ... 또한 list.map 함수가 사용할 목록을 어떻게 알 수 있는지 궁금합니다.이 경우 ys가 아니라 xs – user1072706

+1

당신은'xs'를 분해하고 있습니다. 그래서 각 원소'x'에 대해'ys' 전체를 거쳐'(x, yi)'쌍의리스트를 생성해야합니다. 결국 결과는 모든 쌍 '(xi, yi)'의 목록이고 첫 번째 목록의'xi'와 두 번째 목록의'yi '입니다. – pad

+0

쿨, 자세한 설명 주셔서 감사합니다. – user1072706