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 umIntou preguiçosoInt (nem faz sentido, pois não há tipos preguiçosos).

questionAnswers(1)

yourAnswerToTheQuestion