在名为 developing applications with objective caml 的书的第 95 页
let imap f l =
let l_res = icreate ()
in while not (iempty l) do
ignore (icons (f (ihd l)) l_res) ;
ignore (itl l)
done ;
{ l_res with c = List.rev l_res.c } ;;
上面代码中的ignore函数是做什么的? 在没有实现忽略功能的情况下,我能够得到相同的结果 while循环如下:
let imap f l =
let l_res = icreate ()
in while not (iempty l) do
(icons (f (ihd l)) l_res) ;
(itl l)
done ;
{ l_res with c = List.rev l_res.c } ;;
然后这本书接着说忽略的存在强调了一个事实,即这里重要的不是函数的结果,而是它们对论点的副作用。
如果函数的结果不算数,那么while循环如何停止? 在这种情况下,在我看来,如果 while 循环的结果是 (itl l) 被忽略。 另外,这本书指的是对他们的论点有什么副作用? 谢谢
由于函数
itl
改变了它的输入(在本例中为 l
),当 while
为空时,l
子句终止。我相信 itl
删除了列表的第一个元素,所以基本上你遍历了列表的元素)。
对
ignore
的调用只是为了提高可读性:它们向读者发出信号,表明这些函数未用于其输出——因此它们必须具有一些预期的副作用。
编辑:忽略调用也可能有助于消除编译器警告(参见手册):
val ignore : 'a -> unit
丢弃其参数的值并返回()。例如,ignore(f x) 丢弃副作用函数 f 的结果。相当于f x; (),除了后者可能会产生编译器警告;改写 ignore(f x) 可以避免警告。