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(())
为什么编译器接受这个并隐式地将值展平?
答案 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(_))