OCaml 中的忽略函数

问题描述 投票:0回答:1

在名为 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) 被忽略。 另外,这本书指的是对他们的论点有什么副作用? 谢谢

ocaml
1个回答
17
投票

由于函数

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

ignore
的调用只是为了提高可读性:它们向读者发出信号,表明这些函数未用于其输出——因此它们必须具有一些预期的副作用。

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

val ignore : 'a -> unit

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

© www.soinside.com 2019 - 2024. All rights reserved.