我在上下文中有一个函数(在 Maybe/Option 中),我想向它传递一个值并直接从上下文中获取返回值。
让我们以 Scala 为例:
scala> Some((x:Int) => x * x)
res0: Some[Int => Int] = Some(<function1>)
当然可以
res0.map(_(5))
执行函数,但结果被包装在上下文中。
好的,我可以:
res0.map(_(5)).getOrElse(...)
但我将其复制/粘贴到代码中的任何位置(我有很多函数包含在 Option 中,或者最糟糕的是,包含在 Either...中)。
我需要一个更好的形式,例如:
res0.applyOrElse(5, ...)
“将概念中的函数应用于值并立即从上下文中返回结果”的概念是否存在于具有特定名称的 FP 中(我迷失在所有这些 Functor、Monad 和 Applicatives 中...... )?
最佳答案
您可以使用 andThen
将默认值从调用函数的位置移动到定义它的位置:
val foo: String => Option[Int] = s => Some(s.size)
val bar: String => Int = foo.andThen(_.getOrElse(100))
这仅适用于 Function1
,但如果您想要更通用的版本,Scalaz 为 FunctionN
提供仿函数实例:
import scalaz._, Scalaz._
val foo: (String, Int) => Option[Int] = (s, i) => Some(s.size + i)
val bar: (String, Int) => Int = foo.map(_.getOrElse(100))
这也适用于 Function1
- 只需将上面的 andThen
替换为 map
即可。
更一般地说,正如我上面提到的,这看起来有点像 Kleisli
上的 unliftId
,它采用一个包装函数 A => F[B]
并使用 F
的 comonad 实例折叠 F
。如果您想要一些对 Option
、Either[E, ?]
等通用的东西,您可以编写类似的东西,需要 Optional
> F
的实例和默认值。
关于scala - 执行并获取包装在上下文中的函数的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31500202/