OCaml:在命令式代码中丢弃返回值

时间:2013-03-06 10:37:02

标签: ocaml imperative-programming

如何成功地丢弃函数的返回值并将其视为返回单位(显然是副作用)。显而易见的方法是这样做:

let foo = begin
  some_ignored_thing ();
  actual_return
end

但是,编译器抱怨(带有警告)some_ignored_thing的返回类型不是单位。

我可以创建自己的方法,例如:

let ignore a = ()

这看起来至少简洁并标记了某些事情正在发生,但是语言/ stdlib中是否有任何东西可以达到同样的效果?我认为这将是一个相对常见的用例。

1 个答案:

答案 0 :(得分:10)

实际上,有一个ignore : 'a -> unit函数正是这样做的。

编译器实际上知道ignore并且硬编码通常非常有用的特定行为,但偶尔会有不方便:默认情况下,忽略一个函数(任何类型为{{1}的类型的函数})会发出警告。

这样做的原因是忘记添加函数的最后一个参数是一个相对常见的错误。你可以写一些例如

foo -> bar

而你打算写

ignore (List.map (fun x -> foo bar))

并且您期望看到应用的效果不是。

因此,ignore (List.map (fun x -> foo bar) li) 会在这种情况下发出警告,您的手工编码ignore不会这样做。人们有时也会写

let ignore x = ()

忽略let _ = foo in ... ,但这也有同样的缺点(实际上类型很容易出错)。卡卡杜建议在那里使用类型注释,这是一个合理的建议。

(有些人还使用foo作为他们程序的主要表达式。我建议使用let _ = ...,因为它强制更多类型精度。)

最后,有些人更喜欢使用let () = ...表单,因为他们处于使用let _ = ...会强制他们添加括号或;的情况。我建议您在这些情况下总是添加括号或begin..end,因为例如begin..end的晦涩的优先规则很容易让自己陷入困境。