LINUX.ORG.RU

Ответ на: комментарий от anonymous

map это совсем другая песня. Мой for-each помимо выполнения процедуры в конце концов возвращал нечто вроде (() () ... ()), даже ещё страшнее. Вот я и думаю, можно ли сократить возвращаемое значение до простого () или 0.

seiken ★★★★★
() автор топика

SRFI-1, блин!!!

anonymous
()
Ответ на: комментарий от Begemoth

>(begin
> (apply proc (map car lists))
> (apply foreach proc (map cdr lists)))

Т.о. без императивных конструкций не обойтись?

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

А foreach по определению императивная конструкция. Потому что если тебе не нужен side effect от каждого приложения, то на хрена тебе что-то прикладывать вообще, если уж результат херишь?

anonymous
()

чем map не устраивает? Поточнее задачу сформулировать можешь, или это для тебя непосильный труд?

anonymous
()

Посмотри на монады. Встроенных монад в схеме нет, но их можно туда добавить самому. Где-то в инете даже была реализация монад для схемы.

Если я правильно понял, то тебе нужен аналог хаскелловского mapM для схемы.

anonymous
()
Ответ на: комментарий от anonymous

Обычный for-each, который последовательно выполняет заданную процедуру над каждым элементом списка. Т.о. нужно выполнить процедуру столько раз, сколько эл-тов в списке. При этом значение for-each (и применяемой процедуры) не важно, а "полезный результат" foreach состоит из побочных эффектов от выполнения применяемой к списку процедуры.

>Посмотри на монады. Встроенных монад в схеме нет, но их можно туда >добавить самому. Где-то в инете даже была реализация монад для схемы.

>Если я правильно понял, то тебе нужен аналог хаскелловского mapM для >схемы.

Монады я обязательно посмотрю, но только после того, как прочту SICP.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

>после того, как прочту SICP
... а после него How To Design Programs

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

> Обычный for-each, который последовательно выполняет заданную процедуру над каждым элементом списка. Т.о. нужно выполнить процедуру столько раз, сколько эл-тов в списке. При этом значение for-each (и применяемой процедуры) не важно, а "полезный результат" foreach состоит из побочных эффектов от выполнения применяемой к списку процедуры.

В обычном лиспе для таких целей сгодится mapcar и dolist. Но в чисто функциональном языке программирования приходится использовать монады.

А вообще, общий совет -- если ты хочешь использовать такого рода операторы в фп, то ты пишешь плохой фп код ;) Подумай, как можно изменить алгоритмы, чтоб они не нуждались в такого рода операторах.

допустим, в хаскелле можно написать

mapM_ (putStrLn . show) someList

или

putStr $ lines $ map show someList

Последний код лучше, так как его функциональная часть больше, а нефункциональная (с побочными эфектами) четко отделена от функциональной.

В одной мессаге тяжело описать всю философию написания программ на ФЯП, так что читай, думай и т. д.

anonymous
()
Ответ на: комментарий от anonymous

>если ты хочешь использовать такого рода операторы в фп, то ты пишешь плохой фп код ;)
Я пока мало чего хочу, потому что ещё ничего не знаю :) Это просто пример из SICP, сформулированный предельно конкретно. без каких-либо двусмысленностей. Но в любом случае, за совет спасибо, его я запомню.

>В одной мессаге тяжело описать всю философию написания программ на ФЯП, так что читай, думай и т. д.
Этого и не требуется. Этот пост лишь маленькая капля в океане знаний о программировании.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

> map это совсем другая песня.

В Лиспе можно в map указать в качестве типа возвращаемого элемента nil - его она и вернет. Есть еще reduce, но это тоже не совсем то...

P.S. Я знаю, что SICP - схема, если мешаю могу и заткнуться... ;)

yyk ★★★★★
()
Ответ на: комментарий от seiken

А чем тебе не угодил стандартный for-each? Для него даже порядок выполнения гарантирован, в отличии от map.

anonymous
()
Ответ на: комментарий от anonymous

В SICP для многих стандартных функций есть задания реализовать их, используя методику текущей темы. Например, в теме о стандартных интерфейсах есть задание реализовать map, append и length через функцию-аккумулятор.

seiken ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.