忽略OCaml中的函数

时间:2010-12-22 07:07:49

标签: ocaml

在第95页的题为“使用客观caml开发应用程序”的书中

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)被忽略了。 另外,对于他们的论点有什么副作用是书中提到的? 谢谢

1 个答案:

答案 0 :(得分:13)

由于函数itl会改变其输入(在本例中为l),while子句在l为空时终止。我相信itl删除列表的第一个元素,所以基本上你遍历列表的元素。)

ignore的调用只是为了提高可读性:它们向读者发出信号,表明这些功能并未用于输出 - 因此它们必须具有一些所需的副作用。

编辑:忽略调用也可以帮助消除编译器警告(参见the manual):

val ignore : 'a -> unit
  

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