LINUX.ORG.RU

Списковые включения


0

0

Вопрос просто для самообразования.

Сейчас перечитываю лекции по функ. программированию. Там есть такая фраза что мол Haskell единственный язык, который поддерживыет subj. типа:

[x^2 | x <- [1,2,3]] => [1,4,9]

Но по крайне мере такая же штука есть в Питоне. Вопрос собсвенно в том какие ещё языки имеют подобные встроенные механизмы?

★★★

> Но по крайне мере такая же штука есть в Питоне. Вопрос собсвенно в том какие ещё языки имеют подобные встроенные механизмы?

Любой, в котором есть функция map или ей подобная - т.е. практически любой язык с элементами ФП, тот же лисп, например. То, что ты привел - это просто syntactic sugar для map.

Отличительная фишка Haskell - бесконечные списки. Т.е. можно написать что-то вроде [x^2 | x <- [1,3..]]

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

кстати они и в питоне присутсвуют - xrange кличуться

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

Понятно что это syntactic sugar, вот мне просто интересно(незнаю от куда такое странное желание:) есть ли такая обёртка вокруг map и filter в каких нибудь других языках кроме Хаскеля и Питона. Хотя если подумать то (loop for i in list collect (expt i 2)) тоже самое.

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

(defmacro map-with-sshugar (var cond list) `(map 'list #'(lambda ,var ,cond) ,list))

(map-with-sshugar (x) (* x x) '(1 2 3 4 5 6 7))

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

> ленивые списки модно даже на сях клепать.

Дык понятно что можно, можно и на асме сразу. Но мы же не говорим о тех случаях, когда это сделано через одно место - типа метапрограммирования на плюсовых темплейтах =)

А что оно в лиспе есть - не знал, но не удивлен. При наличии макр это делается на раз.

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

> А что оно в лиспе есть - не знал, но не удивлен. При наличии макр это делается на раз.

Ну, скажем прямо, сделать в лиспе что-то типа хаскеловского

[x^2 | x <- [1..]]

не так уж и легко. В схеме, правда, немного легче, чем в коммон лиспе, в котором нет delay'ев и continuation'ов.

nsav-ng
()
Ответ на: комментарий от int19h

Никаких темплейтов не надо. Желателен только единый интерфейс для доступа к элементам списка. Типа этого:

struct Node { virtual Node * head() =0; virtual Node * tail() =0; };

А далее - ленивый список отличается от обычного тем, что значение следующего элемента вычисляется в момент вызова tail а не при конструировании всего списка. Другими словами tail для обычного списка будет просто возвращать где-то припасенный "следующий" элемент, а tail для ленивого списка будет этот элемент расчитывать и возвращать отталкиваясь от текущего элемента. Так можно реализовать потенциально бесконечные списки. Например, список из натуральных чисел.

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

всмысле последовательность натуральных чисел

1 2 3 4 5 6 7 8 9 ....

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

Смотри Ruby, там очень изящно подобные вещи сделаны.

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

Не понял зачем тут продолжения. Почему delay и force не достаточно (они-то вроде без продолжений реализуются)?

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

> Не понял зачем тут продолжения. Почему delay и force не достаточно (они-то вроде без продолжений реализуются)?

АФАИК тоже достаточно, я не помню уже. Никогда практически их не использовал.

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