因此,当 Optional 值为 时,您有一个Option[A]
, 和一个函数A => B
,以及一个默认值,并且您希望以 . 结尾。(在你的情况下,是和是)。B
None
B
A
MyClass
B
Boolean
作为一个 Haskeller,我想做的第一件事就是胡说八道。回想一下,在 Haskell 中,Option
称为Maybe
. 所以我们hoogleMaybe a -> (a -> b) -> b -> b
,最热门的是maybe :: b -> (a -> b) -> Maybe a -> b
,这正是我们想要的。
data MyClass = MyClass { isOK :: Bool }
newMyClass = MyClass { isOK = true }
myVal = newMyClass
check = maybe False isOK myVal
好吧,这很好,但是 Scala 呢?好吧,相当于 hoogle 的 Scala 是Scalex。我搜索了 Scalex Option[A] => B => (A => B) => B
,但无济于事。因此,让我们看看这个maybe
函数是如何在 Haskell 中实现的。您可以通过 hoogle 的相应链接找到源代码。
maybe :: b -> (a -> b) -> Maybe a -> b
maybe n _ Nothing = n
maybe _ f (Just x) = f x
似乎很容易翻译成 Scala
def option[A, B](opt: Option[A])(n: B)(f: A => B) = opt match {
case None => n
case Some(x) => f(x)
}
然后可以像这样使用它:
val check = option(myVal)(false)(_.isOK)
如果你想用更少的柯里化或拉皮条 Option 类来做到这一点,你将不得不询问比我更精通 Scala 的人,但请注意这基本上归结为 Jhonny Everson 建议的模式匹配。