OCaml中`ignore`功能的真正目的是什么?

时间:2014-04-16 21:23:54

标签: ocaml

OCaml中有一个ignore函数。

val ignore : 'a -> unit
  

丢弃其参数的值并返回()。例如,   ignore(f x)丢弃副作用函数f的结果。它   相当于f x; (),除了后者可能产生一个   编译警告;写忽略(f x)代替避免警告。

我知道这个函数会做什么,但是没有明白使用它。

任何人都可以解释或举例说明必须何时使用它?

2 个答案:

答案 0 :(得分:8)

你基本上回答了自己的问题。你永远不必使用它。关键是要避免警告。如果你写f x; (),编译器会认为你可能做错了。您可能认为f x返回单位,因为您很少想忽略非单位值。

然而,有时这不是真的,你真的想忽略甚至非单位价值。写ignore (f x)文件说明你知道f x会返回一些东西,但你故意忽略它。

请注意,在实际代码中f x可能更复杂,因此您对f x的返回类型错误的可能性相当高。一个例子是部分应用。考虑f : int -> int -> unit。你可能会不小心写f 1,忘记第二个参数,警告会帮助你。另一个示例是,如果您执行open Async,则标准库中的许多函数会从返回单位更改为返回unit Deferred.t。特别是当第一次开始使用Async时,你很可能会意外地认为分号运算符适合你真正需要使用monadic bind的地方。

答案 1 :(得分:3)

作为Ashish Agarwal回答的补充(因为根据你的评论判断,你似乎并不相信):

想象一下,我有一个具有副作用的函数,并返回一个表示计算内容的值。然后,如果我对计算的方式感兴趣,我将需要它的返回值。但是,如果我不关心这个并且只是想要发生副作用,我会使用ignore

哑巴的例子:让我们假设您有一个对数组进行排序的函数,并根据数组的初始状态返回Was_already_sortedWas_not_sorted。然后,如果由于某种原因我有兴趣知道我的数组的排序频率,我可能需要这个函数的返回值。如果没有,我会忽略它。

我同意这是一个愚蠢的例子。也许在许多情况下,处理问题的方法比使用忽略更好(我只是注意到我从未使用ignore)。如果您对此非常满意,可以尝试在现实代码中找到使用此功能的示例(可能在Unison等软件的源代码中)。

另请注意,您可以将let _ = f x用于同一目的。