【发布时间】:2013-11-09 12:35:39
【问题描述】:
感谢 Martin Odersky 在 Coursera 上提供的最新产品,我已经开始使用 scala.util.Try。然而,我惊讶地发现它不一定能很好地与集合 monad 配合使用,因为它没有实现 scala.collection.GetTraversableOnce。
这可能会派上用场。例如,您可以将字符串列表转换为整数,同时丢弃坏的,如下所示:
def ints(strs:List[String]):List[Int] = strs.flatMap(s => Try(s.toInt))
解决方法很简单。只需将 Try 转换为 Option 并让其隐式转换为我们工作:
def ints(strs:List[String]):List[Int] = strs.flatMap(s => Try(s.toInt).toOption)
在我看来 Try 要么实现 GenTraversableOnce 要么有自己的隐式转换。谁能解释为什么它没有?仅仅是因为Try 实际上不是一个单子吗?
【问题讨论】:
-
对于它的价值,我从来没有特别喜欢
Option的成语(尽管我使用它并且它从未咬过我)。有一个显式的catMaybes似乎比通过隐式转换混合 monad 更好。 -
更重要的是:
Option可以很自然地被视为最大长度为 1 的集合。以同样的方式查看Try意味着忽略其部分语义。有时这样做是有意义的(这就是toOption存在的原因),但您不希望它意外发生。 -
@TravisBrown 谈到函数式编程,我仍然是新手,到目前为止,Scala 是我唯一的语言。话虽如此,我没有认识到 Scala Option 和 Haskell Maybe 之间的任何区别。有没有我遗漏的细微差别?
-
@TravisBrown 我在您的第二条评论中看到了您的观点。也许原因是压制
Failure的情况应该是明确的。 -
@TravisBrown 将您的 cmets 关于集合和 Try 之间的语义差异作为答案,我将结束这个问题。
标签: scala monads implicit-conversion