斯卡拉:隐含的扁平化?

时间:2013-08-14 19:56:47

标签: scala

Welcome to Scala version 2.10.1 (OpenJDK 64-Bit Server VM, Java 1.6.0_27).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def o1: Option[Option[Unit]] = Some(()).map(Some(_))
o1: Option[Option[Unit]]

scala> o1
res0: Option[Option[Unit]] = Some(Some(()))

到目前为止一切都如预期的那样。但是,如果我们忘记指定我们在Option中嵌套Option会怎么样?

scala> def o2: Option[Unit] = Some(()).map(Some(_))
o2: Option[Unit]

scala> o2
res1: Option[Unit] = Some(())

为什么编译器接受这个并隐式地将值展平?

1 个答案:

答案 0 :(得分:6)

任何内容都可以转换为Unit

scala> val a: Unit = Some(())
a: Unit = ()

对于o2,编译器会将Some[Unit]转换为Unit。请注意,当然,如果您将Unit替换为Int,则不会发生这种情况,例如:

scala> def o2: Option[Int] = Some(4).map(Some(_))
<console>:7: error: type mismatch;
 found   : Some[Int]
 required: Int
       def o2: Option[Int] = Some(4).map(Some(_))