2015-09-09 51 views
3

我无法弄清楚如何在F#中实现Zip函数。谁能告诉我我做错了什么?以下是我已经输入到fsi.exeF#zip实现

> let rec zip xs ys = 
- match xs with 
- | [] -> [] 
- | head :: tail -> (match ys with 
-      | [] -> [] 
-      | headY :: tailY -> (head, headY) :: zip tail tailY);; 

val zip : xs:'a list -> ys:'b list -> ('a * 'b) list 

> zip [1;2;3;4] ["a","b","c","d"];; 
val it : (int * (string * string * string * string)) list = 
    [(1, ("a", "b", "c", "d"))] 
+0

备选: 让REC ZIP2 XS YS = 比赛XS,与 YS | XH :: XT,YH :: YT - >(XH,YH)::(zip2 xt yt) | _,_ - > [] https://dotnetfiddle.net/9TkL3k –

回答

8

在您的例子["a","b","c","d"]是包含一个元素,这是4维的元组的列表。这就是为什么你从zip获得意想不到的结果。 改为使用;作为元素分隔符。

1

我认为值得指出的是,为了避免在较大的列表上出现堆栈溢出,可能值得使用zip函数进行尾递归。

像这样的事情也许

let zip3 xs ys = 
    let rec loop r xs ys = 
    match xs,ys with 
    | [],[]   -> r 
    | xh::xt,yh::yt -> loop ((xh,yh)::r) xt yt 
    | _ -> failwith "xs & ys has different length" 
    loop [] xs ys |> List.rev