или как это реализовано.
лько я понимаю, ленивая оценка - аргументы не оцениваются до того, как они передаются в функцию, а только тогда, когда их значения фактически используются.
Но в учебнике по Haskell я вижу пример.
xs = [1,2,3,4,5,6,7,8]
doubleMe(doubleMe(doubleMe(xs)))
Автор сказал, что императивный язык, вероятно, пройдет через список один раз и сделает копию, а затем вернет ее. Затем он пройдет через список еще два раза и вернет результат.
Но на ленивом языке, он сначала вычислит
doubleMe(doubleMe(doubleMe(1)))
Это вернетdoubleMe(1)
, который2
, затем4
, и наконец8
.
Так что только один проход по списку и только тогда, когда вам действительно это нужно.
Это меня смущает. Почему ленивый язык не берет список целиком, а разделяет его? Я имею в виду, что мы можем игнорировать, что это за список или выражение, прежде чем использовать его. Но нам нужно оценить все это, когда мы его используем, не так ли?