игнорировать функцию в OCaml - PullRequest
7 голосов
/ 22 декабря 2010

на странице 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 } ;;

Что делает функция игнорирования в приведенной выше кодировке?Мне удалось получить тот же результат без функции игнорирования, реализованной в цикле 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) игнорируется.Кроме того, к каким побочным эффектам в их аргументе обращается книга?Спасибо

1 Ответ

13 голосов
/ 22 декабря 2010

Поскольку функция itl изменяет свой вход (в данном случае l), предложение while завершается, когда l пусто.Я считаю, что itl удаляет первый элемент списка, поэтому, по сути, вы перебираете элементы списка).

Вызовы ignore предназначены только для удобства чтения: они сигнализируют читателю, чтофункции не используются для их вывода - поэтому они должны иметь некоторый желаемый побочный эффект.

РЕДАКТИРОВАТЬ: вызов игнорирования может также помочь устранить предупреждения компилятора (см. руководство ):

val ignore : 'a -> unit

Сбросьте значение его аргумента и return ().Например, ignore (fx) отбрасывает результат побочной функции f.Это эквивалентно FX;(), за исключением того, что последний может генерировать предупреждение компилятора;вместо этого игнорируется запись (fx).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...