OCaml中有一个ignore
函数。
val ignore : 'a -> unit
丢弃其参数的值并返回()。例如, ignore(f x)丢弃副作用函数f的结果。它 相当于f x; (),除了后者可能产生一个 编译警告;写忽略(f x)代替避免警告。
我知道这个函数会做什么,但是没有明白使用它。
任何人都可以解释或举例说明必须何时使用它?
答案 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_sorted
或Was_not_sorted
。然后,如果由于某种原因我有兴趣知道我的数组的排序频率,我可能需要这个函数的返回值。如果没有,我会忽略它。
我同意这是一个愚蠢的例子。也许在许多情况下,处理问题的方法比使用忽略更好(我只是注意到我从未使用ignore
)。如果您对此非常满意,可以尝试在现实代码中找到使用此功能的示例(可能在Unison等软件的源代码中)。
另请注意,您可以将let _ = f x
用于同一目的。