【问题标题】:Ocaml - matching two listsOcaml - 匹配两个列表
【发布时间】:2018-11-09 19:42:45
【问题描述】:

我正在尝试在 OCaml 中编写 shuffle 函数,但是类型推断存在问题。 Merlin 告诉我l1l2 的类型是'a list list,这不是真的,因为它们只是'a list。为什么这么说?

let shuffle l1 l2 =
  let rec scan l1 l2 acc =
    match (l1, l2) with
    | [],[] -> acc
    | ([],h2::t2) -> scan [] t2 h2::acc
    | (h1::t1, []) -> scan t1 [] h1::acc
    | (h1::t1,h2::t2) -> scan t1 t2 h1::h2::acc
  in scan l1 l2 []
;;

【问题讨论】:

    标签: compiler-errors ocaml type-inference operator-precedence


    【解决方案1】:

    根本原因是运算符的优先级不是由您按空格分组的。也就是说,scan [] t2 h2::acc 被解释为(scan [] t2 h2)::acc,而不是scan [] t2 (h2::acc),因为函数应用的优先级高于::。解决方法是在适当的地方添加括号。

    有关 OCaml 中不同运算符的优先级和关联性,请参阅 this table

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多