Це можна прочитати як, « множина всіх чисел виду „2 на “, де — елемент з множини натуральних чисел (), такий що у квадраті більше, ніж .»
В мові Haskell такий запис множини можна відтворити таким списковим виразом:
s=[2*x|x<-[1..],x^2>3]
Тут список [1..] представляє , x^2>3 представляє предикат, а 2*x — вихідний вираз.
Спискові вирази дають результати в означеному порядку (на відміну від членів множини) і можуть ґенерувати елементи за потребою, а не одразу весь список, дозволяючи таким чином, наприклад, попереднє означення членів нескінченної множини.
Історія
Мова програмування SETL (кінець 1960-тих) мала інструкції конструювання множин, і система комп'ютерної алґебри AXIOM (1973) мала подібні конструкції, які обробляли потоки, але вперше термін «comprehension» для таких конструкцій був використаний Родом Бурсталом та Джоном Дарлінґтоном в описі мови програмування NPL (1977).
Smalltalk block context messages, якими є спискові вирази, були в цій мові щонайменше з часів Smalltalk-80.
Робота Бурстала та Дарглінґтона з NPL вплинула на багато мов програмування протягом 1980-тих, але не всі з них включали спискові вирази. Винятком була впливова лінива чисто функціональна мова програмування Miranda, випущена в 1985-тому. Розроблена пізніше, теж цілком функціональна мова з лінивими обчисленнями Haskell, увібрала багато особливостей Міранди, включно з списковими виразами. Мова програмування Python теж зазнала сильного впливу лінивих функціональних мов і ввела спискові вирази. Чисті функціональні мови залишаються нішевими, у той час як Python став значно популярнішим і представив спискові вирази ширшій авдиторії.
Спискові вирази пропонувались як нотація запитів до баз даних[1] і були реалізовані в мові запитів Kleisli[2].
Приклади в різних мовах програмування
Далі йтимуть приклади синтаксису спискових виразів у різних мовах програмування: Хоча в оригінальному прикладі використовується нескінченний список, виразити його можуть не всі мови, тому в деяких ми покажемо як використати підмножину замість підмножини .
Clojure ґенерує нескінченні ліниві послідовності (подібно до Гаскеля, чи ґенераторів Пайтона). Використовуйте take щоб отримати перші N результатів нескінченної послідовности.
List Comprehension in The Free On-line Dictionary of Computing, Editor Denis Howe.
Trinder, Phil (1992). Comprehensions, a query notation for DBPLs. Proceedings of the third international workshop on Database programming languages: bulk types & persistent data, Nafplion, Greece. с. 55—68.
Wadler, Philip (1990). Comprehending Monads. Proceedings of the 1990 ACM Conference on LISP and Functional Programming, Nice. Архів оригіналу за 29 березня 2008. Процитовано 22 липня 2011.
Wong, Limsoon (2000). The Functional Guts of the Kleisli Query System. Proceedings of the fifth ACM SIGPLAN international conference on Functional programming. International Conference on Functional Programming. с. 1—10.