или как это реализовано.

лько я понимаю, ленивая оценка - аргументы не оцениваются до того, как они передаются в функцию, а только тогда, когда их значения фактически используются.

Но в учебнике по Haskell я вижу пример.

xs = [1,2,3,4,5,6,7,8] 

doubleMe(doubleMe(doubleMe(xs)))

Автор сказал, что императивный язык, вероятно, пройдет через список один раз и сделает копию, а затем вернет ее. Затем он пройдет через список еще два раза и вернет результат.

Но на ленивом языке, он сначала вычислит

doubleMe(doubleMe(doubleMe(1)))

Это вернетdoubleMe(1), который2, затем4, и наконец8.

Так что только один проход по списку и только тогда, когда вам действительно это нужно.

Это меня смущает. Почему ленивый язык не берет список целиком, а разделяет его? Я имею в виду, что мы можем игнорировать, что это за список или выражение, прежде чем использовать его. Но нам нужно оценить все это, когда мы его используем, не так ли?