首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala简化嵌套monads

Scala简化嵌套monads
EN

Stack Overflow用户
提问于 2012-08-20 21:37:46
回答 3查看 781关注 0票数 2

我有一些用Lift编写的代码。基本上是它的嵌套框(类似于Option的monad )。如果可能的话,我想把它简化一点。最好添加类型参数,以便在需要时可以很容易地将其更改为字符串或双精度。以下是代码

代码语言:javascript
复制
tryo(r.param("boolean parameter").map(_.toBoolean)).map(_.openOr(false)).openOr(false)

"tryo“是一个帮助器函数,用于在发生异常时捕获和包装Box中的结果,并且r是请求对象。"param“函数返回BoxString。我想让它适用于Int的字符串等,如果可能的话,去掉嵌套的map/openOr (你可以考虑的选项类型中的getOrElse)。

Monad变形金刚?

EN

回答 3

Stack Overflow用户

发布于 2012-08-20 21:52:14

flatMap那狗屎!

代码语言:javascript
复制
r.param("boolean parameter").flatMap(tryo(_.toBoolean)).openOr(false)

或者,使用a表示理解:

代码语言:javascript
复制
val result = for {
  param <- r.param("boolean parameter")
  bool <- tryo(param.toBoolean)
} yield bool
result openOr false

但这并不能解决你获取不同类型的能力。为此,我建议这样做:

代码语言:javascript
复制
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一样。

票数 6
EN

Stack Overflow用户

发布于 2012-08-20 23:09:23

如果你想提取类型,你需要提取缺省值和字符串的转换:

代码语言:javascript
复制
case class Converter[T]( default: T, fromString: String => T )

然后为您的类型定义隐式实例:

代码语言:javascript
复制
implicit val intConverter = Converter[Int]( 0, _.toInt )
implicit val boolConverter = Converter[Boolean]( false, _.toBoolean )

最后,使用pr1001 answer,使用隐式提供的converter值:

代码语言:javascript
复制
def asOrDefault[T](input: Box[String])(implicit conv: Converter[T]): T = input.flatMap(
  s => tryo( conv.fromString(s))).openOr(conv.default)

编译器将为您选择适当的转换器实例:

代码语言:javascript
复制
asOrDefault[Int]( input.param("some int param") )
asOrDefault[Boolean]( input.param("some boolean param") )
票数 3
EN

Stack Overflow用户

发布于 2012-08-21 22:10:07

我对构建在@pr1001和@paradigmatic基础上的版本进行了一些调整。

代码语言:javascript
复制
case class Converter[T]( fromString: String => T )

implicit val boolConverter = Converter(_.toBoolean) 

implicit val intConverter = Converter(_.toInt)

def asOrDefault[T](input: Box[String], default: T)(implicit conv: Converter[T]): T =       
  input.flatMap( s => tryo(conv.fromString(s))).openOr(default)

在我的例子中的用法:

代码语言:javascript
复制
def prettyPrint(implicit r: Req) = asOrDefault(r.param("prettyPrint"), false)

def maxResults(implicit r: Req): Int = asOrDefault(r.param("maxResults"), 20)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12038772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档