是否有类似Haskell的"可能"功能内置于Scala中?

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.

  • 为什么`a => f(a)`而不仅仅是`f`? (4认同)