List.map 返回意外类型

问题描述 投票:0回答:2

我正在学习 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"))]

如何解决这个问题?

ocaml
2个回答
3
投票

您输入了

["a","b"]
,这是一个由一对
("a","b")
组成的列表。您需要分号而不是逗号:
["a";"b"]


2
投票

作为 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 在打印结果元组列表时使用的格式非常相似。这可能表明您已经充分利用了括号。

© www.soinside.com 2019 - 2024. All rights reserved.