4
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嵌套在 an 中Option怎么办?

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

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

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

4

1 回答 1

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(_))
于 2013-08-14T20:07:29.213 回答