选项列表:相当于 Scala 中的序列?
Haskell 的 sequence< 等价于什么/code>
在 Scala 中?我想将选项列表变成列表选项。如果任何选项为
None
,则其结果应为 None
。
List(Some(1), None, Some(2)).??? --> None
List(Some(1), Some(2), Some(3)).??? --> Some(List(1, 2, 3))
What is the equivalent of Haskell's sequence
in Scala? I want to turn list of options into an option of list. It should come out as None
if any of the options is None
.
List(Some(1), None, Some(2)).??? --> None
List(Some(1), Some(2), Some(3)).??? --> Some(List(1, 2, 3))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
Scalaz 定义了序列。
下面是一个示例:
请注意,在第二个示例中,您必须使用 Scalaz 的 some 函数来创建 Some ——否则,List 将被构造为 List[Some[Int]],这会导致此错误:
Scalaz some(a ) 和 none 函数创建 Option[A] 类型的 Some 和 None 值。
Scalaz defines sequence.
Here's an example:
Note that in the second example, you have to use Scalaz's some function to create a Some -- otherwise, the List is constructed as List[Some[Int]], which results in this error:
The Scalaz some(a) and none functions create Some and None values of type Option[A].
如果您想要一个仅针对 List 和 Option 而不是一般 monad 的解决方案,那么以下内容即可完成工作,
REPL 会话,
更新 20/8/2014
只需使用 Scalaz ...
If you want a solution for just List and Option rather a general monad then following will do the job,
REPL session,
Update 20/8/2014
Just use Scalaz ...
这是与上面相同的函数,使用了 FoldRight 和 map/ flatmap 的组合,只需遍历列表一次:
或者,如果您更喜欢 for 理解版本:
Here is the same function as above using a combination of foldRight and map/ flatmap that only has to traverse the list once:
Or, if you prefer the for comprehension version:
首先,我建议您查看 API列表的文档。
至于解决方案,这可能不是最优雅的方法,但它会起作用(并且没有外部依赖项):
并且进行测试以确保......
First off, I recommend that you check out the API docs for List.
As for a solution, this may not be the most graceful way to do it, but it'll work (and with no external dependencies):
And a test just to be sure...
也许这有帮助,因为它只遍历一次并使用递归
Maybe this helps, as it traverses once only and use recursion
通过 for 理解,这非常简单:
This is very simple with a for comprehension:
因为无论如何你都需要展平,所以先做...
尾递归可能是最快的
Since you need to flatten anyway, just do it first...
tail recursion might be quickest