【问题标题】:Warning 10: this expression should have type unit警告 10:这个表达式应该有 unit 类型
【发布时间】:2011-11-01 03:37:55
【问题描述】:

我正在尝试在 Ocaml 中创建函数列表,但我不断收到警告。知道为什么吗?

让 f = [fun x -> -x;fun x -> x+2;fun x -> x*x]

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    分号也用于结束用于其副作用的函数。当这些函数的返回类型不是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] 不同的事实。所以有一个类似于优先级的效果。 []; 一起工作,使某些东西有点像运算符。您可能会争辩说,以这种方式看待它没有帮助。我不会不同意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多