【发布时间】:2011-11-01 03:37:55
【问题描述】:
我正在尝试在 Ocaml 中创建函数列表,但我不断收到警告。知道为什么吗?
让 f = [fun x -> -x;fun x -> x+2;fun x -> x*x]
【问题讨论】:
标签: ocaml
我正在尝试在 Ocaml 中创建函数列表,但我不断收到警告。知道为什么吗?
让 f = [fun x -> -x;fun x -> x+2;fun x -> x*x]
【问题讨论】:
标签: ocaml
分号也用于结束用于其副作用的函数。当这些函数的返回类型不是unit(在本例中为int)时,会出现警告;它们只是警告,因为您可能打算只使用副作用,通常这是一个错误。这是一个旁白,但要以编程方式和安全地使用ignore 函数来抑制这些警告,如ignore (x+2);。
回到您的问题,在其中(并将分号扩展为等价;并修改每个函数的变量)您实际上正在编写,
(fun x ->
let _ = -x in
(fun y ->
let _ = y+2 in
(fun z -> z*z)))
或者,正如gasche指出的另一个例子,
(fun x ->
-x;
(fun y ->
y+2;
(fun z -> z*z)))
您可以从返回的类型(int -> int -> int -> int) list 中看出您的意图立即出现了问题。您需要在每个周围添加括号,例如 (fun x -> x+2); 才能实际创建一个列表。
【讨论】:
[fun x -> (-x; fun x -> x+2; (fun x -> x*x))]。
[3; 4],但这是一个包含一件事的列表:[fun x -> 3; fun x -> 4]。这与[] 和; 的相对优先级无关,而是fun 创造了一个环境,; 的优先级比平时更高(或类似的东西)。
fun的优先级最低,所以吞下;([]的优先级无关,因为它是一个括号;事情不能“跳”出来括号)。见caml.inria.fr/pub/docs/manual-ocaml/expr.html(向下滚动到表格)
[(3;4)] 与[3;4] 不同的事实。所以有一个类似于优先级的效果。 [] 和 ; 一起工作,使某些东西有点像运算符。您可能会争辩说,以这种方式看待它没有帮助。我不会不同意。