我正在学习 OCaml (OCaml 5.0.0)。
我定义了下面的函数。
let make_pair x ls = List.map (fun y -> (x,y)) ls;;
我期望
make_pair 1 ["a","b"];;
返回 [(1,"a");(1,"b")]
,但实际上该函数返回 (int * (string * string)) list = [(1, ("a", "b"))]
。
如何解决这个问题?
您输入了
["a","b"]
,这是一个由一对 ("a","b")
组成的列表。您需要分号而不是逗号:["a";"b"]
。
作为 Sam Henke 非常正确的答案的附录,参考 OCaml 的文档关于优先级和关联性可能会很有启发。
查看此图,我们可以看到
,
的优先级高于 ;
,并且两者的优先级都低于数学运算符和函数应用等内容。这样做的实际效果是:
# let f x = x * 2 in
[f 3 + 1, 8; 8, 9];;
- : (int * int) list = [(7, 8); (8, 9)]
虽然可能方便并且肯定有效,但您可能希望用括号消除歧义。
# let f x = x * 2 in
[(f 3 + 1, 8); (8, 9)];;
- : (int * int) list = [(7, 8); (8, 9)]
请注意,这与 OCaml 在打印结果元组列表时使用的格式非常相似。这可能表明您已经充分利用了括号。