В файле Parsers.scala(Scala 2.9.1) из библиотеки комбинаторов парсеров я, кажется, столкнулся с менее известной функцией Scala, называемой "ленивыми аргументами". Вот пример:
def ~ [U](q: => Parser[U]): Parser[~[T, U]] = { lazy val p = q // lazy argument
(for(a <- this; b <- p) yield new ~(a,b)).named("~")
}
По-видимому, здесь происходит кое-что с назначением аргумента call-by-name q
для lazy val p
.
До сих пор мне не удалось выяснить, что это делает и почему это полезно. Может ли кто-нибудь помочь?