任何可提升为“单位”的 λ 密码域?
Any λ codomain liftable to `Unit`?
显然,这被类型检查器拒绝了:
val a: Unit = 42 // Fail
不过,这很好:
val b: Unit = { 42 }() // Pass
我能理解:
val f: ()->Any = { -> 42 } // Pass
自 Int <: Any
。但是,Unit
必须不同(它不是 Int
的超类型)。是否有一些文档解释发生了什么?
官方文档在 lambda expression syntax:
下对此进行了介绍
If the inferred return type of the lambda is not Unit, the last (or possibly single) expression inside the lambda body is treated as the return value.
所以基本上,如果您将 lambda 显式分配给 returns Unit
的函数类型,或者您调用它并将其结果分配给 Unit
,它会推断您不希望 return lambda 中的最后一个表达式(否则默认情况下会发生)。
val b: Unit = { 42 }()
由于您明确指定 b
的变量类型为 Unit
,lambda 实际上不会 return 42
。另一方面,如果让编译器推断函数类型或适当地指定它,最后的 lambda 语句将成为结果,在本例中为 Int
类型.
以下两种都可以:
val b1: () -> Unit = { 42 }
val b2: () -> Int = { 42 }
还有这些(直接调用 lambda):
val a1: Unit = { 42 }()
val a2: Int = { 42 }()
可以找到文档 here。
A lambda expression is always surrounded by curly braces, parameter declarations in the full syntactic form go inside curly braces and have optional type annotations, the body goes after an -> sign. If the inferred return type of the lambda is not Unit
, the last (or possibly single) expression inside the lambda body is treated as the return value.
显然,这被类型检查器拒绝了:
val a: Unit = 42 // Fail
不过,这很好:
val b: Unit = { 42 }() // Pass
我能理解:
val f: ()->Any = { -> 42 } // Pass
自 Int <: Any
。但是,Unit
必须不同(它不是 Int
的超类型)。是否有一些文档解释发生了什么?
官方文档在 lambda expression syntax:
下对此进行了介绍If the inferred return type of the lambda is not Unit, the last (or possibly single) expression inside the lambda body is treated as the return value.
所以基本上,如果您将 lambda 显式分配给 returns Unit
的函数类型,或者您调用它并将其结果分配给 Unit
,它会推断您不希望 return lambda 中的最后一个表达式(否则默认情况下会发生)。
val b: Unit = { 42 }()
由于您明确指定 b
的变量类型为 Unit
,lambda 实际上不会 return 42
。另一方面,如果让编译器推断函数类型或适当地指定它,最后的 lambda 语句将成为结果,在本例中为 Int
类型.
以下两种都可以:
val b1: () -> Unit = { 42 }
val b2: () -> Int = { 42 }
还有这些(直接调用 lambda):
val a1: Unit = { 42 }()
val a2: Int = { 42 }()
可以找到文档 here。
A lambda expression is always surrounded by curly braces, parameter declarations in the full syntactic form go inside curly braces and have optional type annotations, the body goes after an -> sign. If the inferred return type of the lambda is not
Unit
, the last (or possibly single) expression inside the lambda body is treated as the return value.