这个函数(或者可能是它的一些单子概括)有一个确定的名字吗?从Seq [Option [T]]到Option [Seq [T]]的“自然”函数是否有名称?
def foo[T](in: Seq[Option[T]]): Option[Seq[T]] = {
val res = in.flatten.seq
if (res.length == in.length) Some(res) else None
}
是否有更优雅的实现?
这个函数(或者可能是它的一些单子概括)有一个确定的名字吗?从Seq [Option [T]]到Option [Seq [T]]的“自然”函数是否有名称?
def foo[T](in: Seq[Option[T]]): Option[Seq[T]] = {
val res = in.flatten.seq
if (res.length == in.length) Some(res) else None
}
是否有更优雅的实现?
作为评价已经建议,从Seq[M[A]]
的功能M[Seq[A]]
(其中M
是单子)通常称为sequence
。
它的哈斯克尔定义是:
评估由左到右的顺序每一个动作,并收集结果。
有中阶标准库中没有通用实现的,但是你可以看到这里的Future
类型的例子:https://github.com/scala/scala/blob/v2.10.3/src/library/scala/concurrent/Future.scala#L487-L491
可以在库中,如cats
或scalaz
找到sequence
通用实现。
有一点需要注意的是,sequence
是一个更通用的操作的具体情况,通常称为traverse
。
Haskell的定义如traverse
的结构中的每个元素映射到一个动作,评价从左至右这些操作,而忽略的结果。
现在,给出的定义,sequence
可以在traverse
方面实现,简单地通过使用恒等函数(x => x
)作为traverse
映射操作。
如果你看看上面提到的实现,你会发现他们都利用这种泛化,他们都使用traverse
来实现sequence
。
它通常被称为“序列”(看看Future.sequence例如) https://www.haskell.org/hoogle/?hoogle=sequence 阅读本有关scalaz实现信息:HTTP: //eed3si9n.com/learning-scalaz-day12 –
另请参阅我的答案[这里](http://stackoverflow.com/a/12358892/334519)。 –