2010-12-22 29 views
7

客观CAML书的第95页上忽略功能OCaml中

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 } ;; 

什么是忽略的功能在上面的编码做题为开发应用程序? 我能得到相同的结果,而不在 实现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循环如何停止? 在这种情况下,在我看来,如果忽略 (it11)的结果,则while循环将不断循环。 另外,这本书提到的是什么副作用? 谢谢

回答

13

由于函数itl变异它的输入(在这种情况下l),当l是空的while条款终止。我相信itl删除列表的第一个元素,所以基本上你遍历列表中的元素)。

ignore的调用只是为了提高可读性:它们向读者发出信号,指出函数不用于输出 - 因此它们必须具有一些所需的副作用。

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

val ignore : 'a -> unit 

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

+0

ocaml的必要方面是相当混乱。感谢您的帮助顺便说一句。 – ocamlNewcomer 2010-12-22 07:56:18