在“用OCaml开发应用程序”一书中,有以下关于返回值的解释:
作为分号前面的值被丢弃,当它不是unit.print_int 1;2;3 ;;字符14-15时,目标CAML给出警告:警告:这个表达式应该有类型单元。为避免此消息,可以使用函数print_int 1;忽略2;3 ;;1-:int =3‘
我不明白为什么2的返回值与unit不同,因为我的目的不是返回2,而是返回3。按照我的理解,在我最后一条指令之前的任何指令都不是函数的返回值,那么为什么要发出警告呢?
我的代码中一直都有这样的警告,我越来越清楚,我并不真正理解返回值是如何在OCaml中真正工作的。
谢谢你的帮助。
发布于 2011-06-15 07:32:36
考虑一下表达式e1 ; e2。根据定义--评估整个表达式将导致对e1和e2的计算,而整个表达式的结果值就是e2的值。e1的值结果被丢弃。如果e1的类型是unit,这不是问题,因为它有唯一的单一居民值()。对于所有其他类型,放弃e1的结果意味着丢失信息,这可能不是程序员想要的,因此出现了警告。程序员必须明确地忽略结果值,无论是使用ignore还是使用
let (_:type) = e1 in
e2可以省略类型注释,但确保将e1完全计算为预期类型(而不是部分应用程序)可能是有用的。
发布于 2011-06-15 07:31:56
好吧,警告是存在的,因为您生成一个值但又不使用它这一事实(而且非常经常是)表明您正在做一些错误的事情。如果你不同意这个政策,你可以关掉这个警告。但是,与往常一样,最好不要这样做,在这种情况下,如果您真的不需要表达式的值,您确实可以使用忽略或绑定到_,就像在let _ = f() in ...中那样。
https://stackoverflow.com/questions/6353988
复制相似问题