OCaml:函数输入('a*'b - >'c)

jla*_*tan 2 ocaml function

let rec 

map2 (f : 'a * 'b -> 'c) (l1 : 'a list) (l2 : 'b list) : 'c list =
  match (l1,l2) with
    | ([], []) -> []
    | (x::l1),(y::l2) -> f (x, y)::(map2 f (l1, l2))
Run Code Online (Sandbox Code Playgroud)

它正在回归:

Error: This expression has type 'a list * 'a list
   but an expression was expected of type 'a list
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

gas*_*che 10

错误是map2 f (l1, l2)(正如错误位置会告诉你的那样).你(l1, l2)作为一个元组传递,而它们应该是单独的curried参数:map2 f l1 l2.

此外,您的函数不处理不同长度的情况(一个列表为空而不是另一个列表的模式).在这种情况下,该函数将引发匹配失败,您可能希望引发更专业的错误,例如invalid_arg "map2"或某事.

  • @manojlds当然,OCaml也会发出警告."警告P:这种模式匹配并不详尽.下面是一个不匹配的值的示例:(_ :: _,[])" (4认同)