Luk*_*asz 2 monads scala monad-transformers
我有一些用Lift编写的代码.基本上它的嵌套Box(类似monad to Option).如果可能的话,我想稍微简化一下.最好添加类型参数,这样可以根据需要轻松更改为字符串或双精度.这是代码
tryo(r.param("boolean parameter").map(_.toBoolean)).map(_.openOr(false)).openOr(false)
Run Code Online (Sandbox Code Playgroud)
"tryo"是辅助函数,用于捕获并在Box中包含结果,如果发生异常且r是Req对象."param"函数返回Box [String](来自请求参数).我想让它适用于Int的String等等,如果可能的话,摆脱嵌套的map/openOr(你认为在Option类型中有getOrElse).
Monad变形金刚?
flatMap 那个sh*t!
r.param("boolean parameter").flatMap(tryo(_.toBoolean)).openOr(false)
Run Code Online (Sandbox Code Playgroud)
或者,使用一个理解:
val result = for {
param <- r.param("boolean parameter")
bool <- tryo(param.toBoolean)
} yield bool
result openOr false
Run Code Online (Sandbox Code Playgroud)
但这并不能解决你获得不同类型的能力.为此我会建议像:
def asOrDefault[T](input: Box[Any])(default: => T): T = input.flatMap(tryo(_.asInstanceOf[T])).openOr(default)
asOrDefault(r.param("any param"))(0)
Run Code Online (Sandbox Code Playgroud)
这是未经测试的......请注意,scala.util.control.Exception.allCatch.opt()它将返回一个Option就像tryo返回一样Box.
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |