为什么 () => () 不是 Nothing => () 的子类型

Cap*_*ous 4 scala covariance higher-order-functions unit-type bottom-type

在 scala 中,函数的输出类型是协变的,输入类型是逆变的。

例如,如果Dog是 的子类型Animal,则

T => Dog是 的子类型T => Animal,并且 Animal => T是 的子类型Dog => T

换句话说, 的生产者Dog可以前往 的生产者Animal期望的地方,而 的消费者Animal可以前往 的消费者Dog期望的地方。

那么为什么我会收到这个编译错误:

def useF(f: Nothing => Unit): Unit = ()
def f(x: Unit): Unit = ()
useF(f) // ok
useF(() => ()) // error

/*
example.scala:4: error: type mismatch;
 found   : () => Unit
 required: Nothing => Unit
useF(() => ())
*/
Run Code Online (Sandbox Code Playgroud)

我认为这Nothing是 的子类型Unit,所以() => ()应该是 的子类型Nothing => (),因为() => ()是类型Unit => Unitf和之间的类型签名有什么区别() => ()

tex*_*uce 7

你的逻辑是正确的。只是语法错误。

() => T不是Function1[Unit, T]。它实际上是不带参数的 lambda 语法,结果是Function0[T]. 这里的括号不是单位。这是表示零参数的语法

构造a的正确方法Unit => Unit是:

(_: Unit) => Unit
Run Code Online (Sandbox Code Playgroud)

您可以添加显式类型注释来验证:

val f: Function1[Unit, Unit] = _ => ()
useF(f)
// No error
Run Code Online (Sandbox Code Playgroud)