Scala (Lift) lazy val внутри Option или Box

У меня возникла небольшая проблема с использованием Параметры и Отложенная оценка вместе. например, когда я пробую этот код в REPL, я получаю следующее

lazy val a = 3+3

РЕПЛ говорит:

a: Int = <lazy>

что очень круто, но..

val b = Some(a)

РЕПЛ говорит:

b: Some[Int] = Some(6)

Похоже, что Некоторым приходится оценивать аргумент, прежде чем помещать его в Option :(

также

val b = Box !! a

оценивает

b: net.liftweb.common.Box[Int] = Full(6)

тот же эффект :(

есть ли обходной путь, мне просто нужен вариант с ленивым валом внутри, если бы я мог добиться следующего, было бы здорово

b: Some[Int] = Some(<lazy>)

Примечание:

Прежде чем задать вопрос, я провел небольшое исследование и обнаружил, что scalaz имеет что-то под названием LazyOption, интересное, но я не мог его использовать :(

Любая помощь !


person Emad Shaaban    schedule 04.08.2013    source источник
comment
Вы можете использовать lazy val b: Option[Int] или Option[() => Int].   -  person senia    schedule 04.08.2013
comment
Большое спасибо, @senia Option[() => Int] справилась.   -  person Emad Shaaban    schedule 04.08.2013


Ответы (1)


Когда вы выполняете: val a = Some(b), вы принудительно оцениваете b, поскольку a требует значения. Если вы не хотите, чтобы оценка была отложена, вам также нужно сделать b ленивым.

scala> lazy val b = Some(a)
b: Some[Int] = <lazy>
person jcern    schedule 04.08.2013
comment
вы правы, но я должен заранее оценить сам вариант (мне нужно передать его функции вызова по значению), поэтому я не могу использовать ваше решение ... вариант с функцией внутри, как то, что сказал Сеня, сделал свое дело, спасибо в любом случае @jcern :) - person Emad Shaaban; 04.08.2013