首页 > 解决方案 > 什么是 Scala 中的单元类型行为

问题描述

为什么此代码有效:

val f: String => Unit = {(_:String) => 2}

//or more succinctly

val f: String => Unit = _ => 2

显然我的函数体返回一个 int。但是预期的类型是 Unit

但如果我这样做

implicitly[String <:< Unit]

//Cannot prove that String <:< Unit.

因此,我对演员阵容是如何发生的感到有些困惑?为什么一开始就被允许

标签: scalatypes

解决方案


这称为Value Discarding,参见6.26.1 Value Conversions, Scala 语言规范的Value Discarding 小节:

如果有一些值类型,预期的类型是Unit,通过将其嵌入到 term 中,将其转换为预期的类型{ ; () }

换句话说,您的代码被编译为就像您编写的一样

val f: String => Unit = {(_:String) => { 2; () }}

//or more succinctly

val f: String => Unit = _ => { 2; () }

我猜这个特性背后的意图是让来自命令式编程语言的程序员熟悉,在这种语言中,通常可以丢弃值。

例如,在 C 中,写成是合法的

printf("Hello");

并丢弃返回值,即使printf返回一个int. 这与许多命令式编程语言所具有的表达式语句语句表达式的概念相结合。


推荐阅读