2.8个系列的新功能。这个签名会是什么样的?与scalaz序列相似

时间:2010-10-03 19:20:30

标签: scala scala-collections scalaz

我今天发现blog post提到了scalaz的sequence功能。

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

if (l contains None) None else l

如果是这样,这个功能签名会是什么样的? 包含在SeqLike中,对吧?

此外,从博客文章中我认为序列将类似于地图,但是会遇到一个会中断。有这样的事吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

[编辑]已更正

答案 1 :(得分:1)

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