在 OCaml 中实现 zip

Implementing zip in OCaml

我有 haskell 背景,现在正在努力学习 OCaml

我正在尝试将 zip 实施为练习,但出现语法错误;正确的语法是什么?

let rec zip (l1 : 'a list) (l2 : 'b list) : ('a * 'b) list = 
    match l1 l2 with
      [] _  -> []
    | _ []  -> []
    | (x::xs) (y::ys) -> (x,y)::(zip xs ys)

这不是一个模式:

_ []

没有由函数应用程序组成的模式。这使它成为语法错误,而不仅仅是前面表达式 l1 l2.

中的语义问题

(经过编辑给出了实际上错误的模式。)

当你deconstruct/construct一对时,你需要在它的成员之间放一个,。 这意味着您的 zip 函数变为:

let rec zip (l1 : 'a list) (l2 : 'b list) : ('a * 'b) list = 
    match l1,l2 with
    | [],_  -> []
    | _,[]  -> []
    | (x::xs),(y::ys) -> (x,y)::(zip xs ys)

此外,请注意 OCaml 提供 or-patterns 时模式匹配 return 相同值

的几种情况