了解Scala中的Option.flatten

Mic*_*ael 10 scala

我注意到,Option.flatten定义如下:

def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
    if (isEmpty) None else ev(this.get)

这是什么ev?什么A <:< Option[B]意思?它是干什么用的 ?

che*_*dze 14

这是限制某些方法针对特定类型执行的常见做法.实际上,<:<是一种定义scala.Predef如下的类型:

@implicitNotFound(msg = "Cannot prove that ${From} <:< ${To}.")
sealed abstract class <:<[-From, +To] extends (From => To) with Serializable
...
implicit def conforms[A]: A <:< A = ...
Run Code Online (Sandbox Code Playgroud)

因此,<:<[A, B]只有当A是B的子类型时,才能解析隐式类型.

在这种情况下,只有Option在包裹在另一个中时才能解决它Option.在任何其他情况下,将发生编译错误:

scala> Option(42).flatten
<console>:8: error: Cannot prove that Int <:< Option[B].
          Option(42).flatten
                     ^
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅 http://blog.bruchez.name/2015/11/generalized-type-constraints-in-scala.html 以获得深入的解释。我对如何处理“ev”参数特别感兴趣,本文对此进行了解释。我已添加到此答案以包含该信息。 (2认同)