В текущей версии Scala есть более чистый способ создания «ленивого шаблона конструктора» - PullRequest
10 голосов
/ 05 февраля 2012

ближайшая вещь к

case class Foo(lazy next: Foo)

что я смог придумать это

class Foo(_next: =>Foo) {
    lazy val next = _next
}
object Foo {
    def apply(next: =>Foo) = new Foo(next)
    def unapply(foo: Foo) = Some(foo.next)
}

Я обнаружил перечисленную проблему добавьте ленивые параметры , поэтому я думаю, что она будет добавлена когда-нибудь. А пока кто-нибудь знает более чистый трюк, чем описанный выше?

1 Ответ

7 голосов
/ 05 февраля 2012

Может быть scalaz.Need?Это было предложено мне в этом ответе .

scala> case class Foo(next: Name[Foo])
defined class Foo

scala> lazy val x: Foo = Foo(Need(y)); lazy val y: Foo = Foo(Need(x))
x: Foo = <lazy>
y: Foo = <lazy>

scala> x.next.flatMap(_.next).value eq x
res61: Boolean = true
...