gpt4 book ai didi

Scala 简化了嵌套的 monad

转载 作者:行者123 更新时间:2023-12-04 19:52:00 44 4
gpt4 key购买 nike

我有一些代码是用 Lift 编写的。基本上是它的嵌套 Box(类似于 Option 的 monad)。如果可能的话,我想稍微简化一下。最好添加类型参数,以便在需要时可以轻松将其更改为字符串或 double 。这是代码

tryo(r.param("boolean parameter").map(_.toBoolean)).map(_.openOr(false)).openOr(false)

“tryo”是辅助函数,用于在发生异常且 r 是 Req 对象时捕获结果并将其包装在 Box 中。 “param”函数返回 Box[String](来自请求参数)。我想让它适用于 Int 的 String 等,如果可能的话,摆脱嵌套的 map/openOr(getOrElse 在你认为的 Option 类型中)。

Monad 转换器 ?

最佳答案

flatMap 那该死!

r.param("boolean parameter").flatMap(tryo(_.toBoolean)).openOr(false)

或者,使用 a 表示理解:

val result = for {
param <- r.param("boolean parameter")
bool <- tryo(param.toBoolean)
} yield bool
result openOr false

但这并不能解决您获取不同类型的问题。为此,我建议如下:

def asOrDefault[T](input: Box[Any])(default: => T): T = input.flatMap(tryo(_.asInstanceOf[T])).openOr(default)

asOrDefault(r.param("any param"))(0)

这是未经测试的...还要注意 scala.util.control.Exception.allCatch.opt() 将返回一个 Option 就像 tryo 返回一个 Box

关于Scala 简化了嵌套的 monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12038772/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com