scala - 执行并获取包装在上下文中的函数的返回值?

标签 scala scalaz

我在上下文中有一个函数(在 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。如果您想要一些对 OptionEither[E, ?] 等通用的东西,您可以编写类似的东西,需要 Optional > F 的实例和默认值。

关于scala - 执行并获取包装在上下文中的函数的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31500202/

相关文章:

scala - 一键将一个大拼花文件拆分为多个拼花文件

Scalaz: `scalaz.syntax.applicative._` 如何发挥它的魔力

scala - 在另一个 monad 中验证的好语法

python - 将基于 python-twisted 的代码移植到 scala : framework advice needed

scala Iterator 中的 scalaz Iteratees

scala - 重载具有多个参数列表的方法是否违法?

scala - 无定形案例类转换

scala - scala 中的拓扑排序

scala - scalaz 中有 >> monad 运算符吗?

scala - 如何在 eclipse juno 中配置 scaladoc?