Я собирался комментировать относительно схемы @ knivil. Вместо этого я просто брошу это как другой ответ.
Ленивые структуры данных - не единственный способ для выполнения большинства задач. Это может раздражать Pythonistas. Но я считаю, что лучше всего, когда программисты выбирают, какие методы они используют. Ленивые техники мощные и элегантные.
Knivil упоминается с использованием схемы iota
. Посмотрите, как легко написать полный метод (со всеми 3 аргументами), полагаясь на лень:
iota count begin step = let xs = begin:map (+step) xs
in take count xs
-- or, alternately
iota count begin step = take count $ map ((+begin).(*step)) [0..]
Я также мог бы написать length
для непустых списков, злоупотребляя ленью:
len = fst . last . zip [1..]
-- or even handling empty lists
len = fst . last . zip [0..] . (undefined:)
Рассмотрим мощную и элегантную функцию iterate
, определенную в Prelude.
iterate f x = x : iterate f (f x)
Создает бесконечный список [x, f x, f (f x), f (f (f x)), ...]
. Я мог бы написать iota
в терминах iterate
:
iota count begin step = take count $ iterate (+step) begin
Ленивый подход - элегантный способ программирования. Это не единственный способ, и люди, привыкшие к C или Java, наверняка будут кричать «но мне не нужно лень , я могу просто _», и они правы. Если ваш язык полный по Тьюрингу, это можно сделать. Но лень может быть такой элегантной.