2010-12-22 33 views
7

en la página 95 del libro titulado con el desarrollo de aplicaciones caml objetivoignorar función en 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 } ;; 

¿Qué hace la función de hacer caso omiso de la codificación de arriba? que era capaz de conseguir el mismo resultado sin la función de ignorar implementado en el bucle while de la siguiente manera:

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

A continuación, el libro sigue y dice que la presencia de ignorar hace hincapié en el hecho de que no es el resultado de las funciones que cuentan aquí, pero sus efectos secundarios en su argumento.

si el resultado de las funciones no cuenta, entonces ¿cómo se detiene el ciclo while? En este caso, me parece que el ciclo while se repetirá continuamente si se ignora el resultado de (itl l). Además, ¿qué efectos secundarios tiene su argumento al referirse al libro? Gracias

Respuesta

13

Dado que la función itl muta su entrada (en este caso l), la cláusula while termina cuando l está vacía. Creo que itl elimina el primer elemento de la lista, por lo que esencialmente iterar sobre los elementos de la lista).

Las llamadas a ignore son solo por la legibilidad: indican al lector que las funciones no se utilizan para su salida, por lo que deben tener algún efecto secundario deseado.

EDIT: la llamada a ignorar también puede ayudar a eliminar las advertencias del compilador (ver the manual):

val ignore : 'a -> unit 

Descartar el valor de su argumento y de retorno(). Por ejemplo, ignorar (f x) descarta el resultado de la función de efectos colaterales f. Es equivalente a f x;(), excepto que este último puede generar una advertencia de compilación; escribir ignorar (f x) evita la advertencia.

+0

el lado imperativo de ocaml es bastante confuso. Gracias por tu ayuda por cierto. – ocamlNewcomer

+0

ignorar se puede implementar como: 'let ignore v = let _ = v in()' fyi. De hecho, antes de aprender sobre 'ignorar' haría eso para deshacerme de las advertencias del compilador. –