什么是Scalaz 7中map2的新名称?

时间:2015-09-30 20:01:24

标签: scala functor scalaz scalaz7

来自Scalamachine的this presentation的Jordan West清楚地谈到了map2的功能。事实证明函数是available in Scalaz 6,但我无法在Scalaz 7中找到它或任何等效函数。

E.g。我希望能够运行此代码:

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]]

3 个答案:

答案 0 :(得分: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是一种不同的野兽。

答案 1 :(得分:-1)

我没有在scalaz 7中找到map2和@ I.K的应用方法。是我能想到的最相似的。但是,在“列表形状”没有变化的情况下,我会mapmappend

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

当然,如果分配给该类型的默认操作不是所需的操作,那么我将使用scalaz中的退出Tag或自定义implicit

修改

我刚刚注意到你的答案:使用traverse

可以实现另一种预期的结果
List(1.some, 2.some, 3.some) traverseU (_ |+| 1.some)
Some(List(2, 3, 4))

答案 2 :(得分:-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