你不能做一些简单的事情:
if (l contains None) None else l
如果是这样,这个函数签名会是什么样子? 包含在 SeqLike 中,对吗?
此外,从博客文章中,我认为 sequence 将类似于 map,但一旦遇到 None 就会中断。有这样的事情吗?
你不能做一些简单的事情:
if (l contains None) None else l
如果是这样,这个函数签名会是什么样子? 包含在 SeqLike 中,对吗?
此外,从博客文章中,我认为 sequence 将类似于 map,但一旦遇到 None 就会中断。有这样的事情吗?
是的,你可以,但应该是:
if (l contains None) None else Some(l.map(_.get))
博客文章中的代码尝试尽可能通用地编写该函数(使用 scalaz 的抽象),因此它不仅适用于 Seq 中的选项。
[编辑] 更正
是的,您绝对可以编写专门针对某些特定数据结构的序列函数。然而,Scalaz 版本尽可能通用。所以它适用于任何可能F
的组合。G
F[G[A]] => G[F[A]]
您要查找的另一个函数称为traverse
. 它有签名
def traverse[F[_]:Traverse,G[_]:Applicative,A,B](m: F[A], f: A => G[B]): G[F[B]]
x.traverse(f)
相当于x.map(f).sequence
。
x.sequence
相当于x.traverse(a => a)