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 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.