1

我今天发现一篇文提到了 scalaz 的序列函数。

你不能做一些简单的事情:

if (l contains None) None else l

如果是这样,这个函数签名会是什么样子? 包含在 SeqLike 中,对吗?

此外,从博客文章中,我认为 sequence 将类似于 map,但一旦遇到 None 就会中断。有这样的事情吗?

4

2 回答 2

2

是的,你可以,但应该是:

if (l contains None) None else Some(l.map(_.get))

博客文章中的代码尝试尽可能通用地编写该函数(使用 scalaz 的抽象),因此它不仅适用于 Seq 中的选项。

[编辑] 更正

于 2010-10-03T19:33:36.807 回答
1

是的,您绝对可以编写专门针对某些特定数据结构的序列函数。然而,Scalaz 版本尽可能通用。所以它适用于任何可能F的组合。GF[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)

于 2010-10-05T18:11:04.420 回答