从 Seq[Option[T]] 到 Option[T]] 的 "natural" 函数是否有名称?



这个函数(或者可能是它的某种一元推广)是否有一个既定的名称?

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是monad)的函数通常称为sequence

Haskell对它的定义是:

从左到右评估序列中的每个操作,并收集结果。

在 scala 标准库中没有它的通用实现,但你可以在这里看到 Future 类型的示例:https://github.com/scala/scala/blob/v2.10.3/src/library/scala/concurrent/Future.scala#L487-L491

您可以在 catsscalaz 等库中找到 sequence 的通用实现。

需要注意的一件事是,sequence是更通用操作的特定情况,通常称为 traverse .

Haskell将traverse定义为

将结构的每个元素映射到操作,从左到右评估这些操作,并忽略结果。

现在,给定定义,sequence可以用traverse来实现,只需使用恒等函数(x => x)作为traverse的映射运算即可。

如果你看一下上面提到的实现,你会发现它们都利用了这种泛化,并且它们都使用traverse来实现sequence

最新更新