Scala: Function0 vs parâmetros por nome
Alguém pode dar uma resposta definitiva sobre como parâmetros por nome=> T
eFunction0
parâmetros() => T
são transformados um no outro pelo compilador Scala? Eu sei que eles não são os mesmos, mas a diferença é muito sutil, pois eles podem ser usados de forma intercambiável em muitos cenários.
Exemplo: se eu definir
def someFunction: Int = 2
def f(x: => Int): Unit = println(x)
então eu posso ligar com sucesso
f(2)
f(someFunction)
Como é() => Int
um substituto aceitável para=> Int
?
Mais geralmente, é() => T
um substituto universalmente aceitável para um nome=> T
parâmetro?
Além disso, corrija-me se estiver errado sobre o seguinte raciocínio:=> T
nunca é um substituto aceitável para() => T
porque o primeiro é um tipo de valor (T
), o outro é um tipo de função. Ou seja, se eu tiverdef f(x: () => Int)
, Nunca poderei passar umInt
ou preguiçosoInt
(nem faz sentido, pois não há tipos preguiçosos).