Рассмотрим эту функцию, которая удваивает все элементы в списке:
doubleMe [] = []
doubleMe (x:xs) = (2*x):(doubleMe xs)
Затем рассмотрим выражение
doubleMe (doubleMe [a,b,c])
Кажется очевидным, что во время выполнения это первое расширение:
doubleMe ( (2*a):(doubleMe [b,c]) )
(Это очевидно, потому что никаких других возможностей не существует, насколько я вижу).
Но мой вопрос таков: Почему именно это теперь расширяется до
2*(2*a) : doubleMe( doubleMe [b,c] )
вместо
doubleMe( (2*a):( (2*b) : doubleMe [c] ) )
?
Интуитивно, я знаю ответ: Потому что Хаскелл ленив. Но может ли кто-нибудь дать мне более точный ответ?
Есть ли что-то особенное в списках, которые вызывают это, или идея более общая, чем просто списки?