3

Jordan West 在Scalamachine 的这个演讲中清楚地谈到了map2函数。原来该功能在 Scalaz 6 中可用,但我在 Scalaz 7 中找不到它或任何等效项。

例如,我希望能够运行此代码:

List(Some(1), Some(2)).map2(_ + 1)

结果得到

List(Some(2), Some(3))

在 Scalaz 7 中哪里可以找到这个函数?

编辑: 理想情况下,我希望能够执行任何f: A => B功能l: List[Option[A]]

l.map2(f)

并获得List[Option[B]]直观的语义。

4

3 回答 3

0

您可以改用应用语法:

scala> List(Some(1), Some(2)) <*> List((x:Option[Int]) => x |+| Some(1))
res0: List[Option[Int]] = List(Some(2), Some(3))

与 Scalaz 6 相比,Scalaz 7 是一个不同的野兽。

于 2015-09-30T22:20:22.903 回答
-1

map2我在 scalaz 7中没有找到,@IK 的应用方法是我能想到的最相似的方法。但是,在这种“列表的形状”没有改变的情况下,我mapmappend

List(1.some, 2.some) map (_ |+| 1.some)
res: List[Option[Int]] = List(Some(2), Some(3))

当然,如果分配给该类型的默认操作不是所需的,那么我会使用 exiting Tagfrom scalaz 或 custom implicit

编辑

我刚刚注意到您的回答:使用可以实现相反的预期结果traverse

List(1.some, 2.some, 3.some) traverseU (_ |+| 1.some)
Some(List(2, 3, 4))
于 2015-10-01T04:55:03.293 回答
-2

好的,Scalaz 7 中似乎不存在这样的功能,但是使用 Monad Transformers 有一个很好的方法:

OptionT[List, Int](List(Some(1), Some(2))).map(_ + 1).run

// List(Some(2), Some(3))

或在l: List[Option[A]]

OptionT[List, A](l).map(f).run
于 2015-09-30T21:22:18.650 回答