5

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

let foo = begin
  some_ignored_thing ();
  actual_return
end

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

我可以发明自己的方法,例如:

let ignore a = ()

这似乎至少简洁并标记了正在发生的事情,但是语言/标准库中是否有任何东西可以实现相同的目标?我原以为这将是一个相对常见的用例。

4

1 回答 1

11

确实,有一个ignore : 'a -> unit函数可以做到这一点。

编译器实际上知道ignore并硬编码通常非常有用的特定行为,但有时可能会带来不便:默认情况下,忽略函数(任何具有 form 类型的函数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,但这也有同样的缺点(很容易弄错类型实际上是什么)。Kakadu 建议在那里使用类型注释,这是一个合理的建议。

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

最后,有些人更喜欢使用let _ = ...表单,因为他们处于使用;会迫使他们添加括号或的情况begin..end。我建议您始终添加括号或begin..end在这些情况下,因为使用它很容易使自己陷入困境 -if..then..else..例如模糊的优先规则。

于 2013-03-06T11:12:39.393 回答