忽略OCaml中的函数

oca*_*mer 7 ocaml

在标题为使用客观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 } ;;
Run Code Online (Sandbox Code Playgroud)

ignore函数在上面的编码中做了什么?如果没有在while循环中实现的ignore函数,我能够得到相同的结果,如下所示:

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 } ;;
Run Code Online (Sandbox Code Playgroud)

然后这本书继续说并且忽略的存在强调了这不是这里重要的函数的结果,而是它们对它们的论证的副作用.

如果函数的结果不计算,那么while循环如何停止?在这种情况下,在我看来,如果忽略(itl l)的结果,while循环将连续循环.另外,对于他们的论点有什么副作用是书中提到的?谢谢

nim*_*odm 13

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

调用ignore仅仅是为了可读性:它们向读者发出信号,表示功能不用于输出 - 因此它们必须具有一些所需的副作用.

编辑:忽略调用也可能有助于消除编译器警告(参见手册):

val ignore : 'a -> unit
Run Code Online (Sandbox Code Playgroud)

丢弃其参数的值和return().例如,ignore(fx)丢弃副作用函数f的结果.它相当于fx; (),但后者可能会生成编译器警告; 写ignore(fx)代替避免警告.