2010-12-22 30 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