在 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 相同值
的几种情况
我有 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 相同值
的几种情况