Ocaml - 匹配两个列表
Ocaml - matching two lists
我正在尝试在 OCaml 中编写随机播放函数,但类型推断存在问题。 Merlin 告诉我 l1
和 l2
是 '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 []
;;
根本原因是运算符优先级不是由空格分组决定的。也就是说,scan [] t2 h2::acc
被解释为 (scan [] t2 h2)::acc
,而不是 scan [] t2 (h2::acc)
,因为函数应用程序的优先级高于 ::
。解决方法就是在适当的地方添加括号。
请参阅 this table 了解 OCaml 中不同运算符的优先级和结合性。
我正在尝试在 OCaml 中编写随机播放函数,但类型推断存在问题。 Merlin 告诉我 l1
和 l2
是 '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 []
;;
根本原因是运算符优先级不是由空格分组决定的。也就是说,scan [] t2 h2::acc
被解释为 (scan [] t2 h2)::acc
,而不是 scan [] t2 (h2::acc)
,因为函数应用程序的优先级高于 ::
。解决方法就是在适当的地方添加括号。
请参阅 this table 了解 OCaml 中不同运算符的优先级和结合性。