Wil*_*ill 14 functional-programming scala
我正在寻找的是这个功能:
def maybe[A, B](a: Option[A])(f: A => B)(g: () => B): B = a match
{
case Some(x) => f(x)
case None => g()
}
Run Code Online (Sandbox Code Playgroud)
这是在Haskell的前奏中所以我认为它可能在某个地方的Scala标准库中,我只是错过了它.我讨厌不得不在项目中重新编码,所以我想知道是否有人知道它在哪里,或者它是否肯定不存在.或者有更好的方法来获得此功能?
Dan*_*wak 16
其他答案给出了map
+ getOrElse
组成.仅供记录,您可以通过以下方式"添加" maybe
功能Option
:
implicit def optionWithMaybe[A](opt: Option[A]) = new {
def maybe[B](f: A=>B)(g: =>B) = opt map f getOrElse g
}
Run Code Online (Sandbox Code Playgroud)
值得注意的是,当函数参数最后出现时,Scala中高阶函数的语法通常更好.因此,更好的组织方式maybe
如下:
def maybe[B](g: =>B)(f: A=>B) = opt map f getOrElse g
Run Code Online (Sandbox Code Playgroud)
这可以使用如下:
val opt: Option[String] = ...
opt.maybe("") { _.toUpperCase }
Run Code Online (Sandbox Code Playgroud)
Ben*_*ngs 14
你可以做到
val opt:Option[A] = // ...
val result:B = opt.map(f).getOrElse(g());
Run Code Online (Sandbox Code Playgroud)
getOrElse
采用一个名字参数,因此g
只有当opt
它被评估时才会被评估None
.