【问题标题】:OCaml return valuesOCaml 返回值
【发布时间】:2011-09-15 06:55:47
【问题描述】:

在'Developing Applications with OCaml'一书中,关于返回值有如下解释:

由于分号前面的值被丢弃,Objective CAML 会在它不是单元类型时发出警告。

# print_int 1; 2 ; 3 ;;
Characters 14-15:
Warning: this expression should have type unit.
1- : int = 3


To avoid this message, you can use the
function ignore:

# print_int 1; ignore 2; 3 ;; 
1- : int = 3`

我不明白为什么2 的返回值与unit 不同会是个问题,因为我的意图不是返回2,而是返回3。按照我的理解,我最后一条指令之前的任何指令都不是函数的返回值,那么为什么会出现警告?

我的代码中一直有这个警告,我越来越清楚我并不真正理解返回值在 OCaml 中是如何工作的。

感谢您的帮助。

【问题讨论】:

    标签: return-value ocaml


    【解决方案1】:

    考虑表达式e1 ; e2。根据定义 - 评估整个表达式会导致评估 e1,然后评估 e2,并且整个表达式的结果值是 e2 的值。 e1 的值结果被丢弃。如果e1 的类型是unit,这不是问题,因为它具有唯一的单一居民值()。对于所有其他类型,丢弃 e1 的结果意味着丢失可能不是程序员想要的信息,因此会发出警告。程序员必须明确地忽略结果值,要么使用ignore,要么使用

    let (_:type) = e1 in
    e2
    

    可以省略类型注释,但确保 e1 被完全评估为预期类型(不是部分应用程序)可能很有用。

    【讨论】:

    • 部分应用会导致另一个警告:)
    • 这是一个关于类型注释的有趣注释,这可能是我从未考虑过的。
    • @akoprowski:没有。 let g () = let f x y = x + y in let _ = f 2 in f 1 2
    • @ygrek: 好的,是的,你不能用'_'绑定得到它,但是当你使用忽略let g () = let f x y = x + y in ignore (f 2); f 1 2时你会这样做
    • @akoprowski:确实,ignore 在编译器中是特殊情况。
    【解决方案2】:

    好吧,警告就在那里,因为您产生了一个值但随后不使用它的事实可能(并且非常通常是)表明您做错了。如果您不同意此政策,您可以关闭该警告。但像往常一样,最好不要这样做,在这种情况下,如果您真的不需要表达式的值,您确实可以使用忽略或将其绑定到_,如let _ = f() in ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2013-02-21
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多