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]]
。
答案 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的应用方法。是我能想到的最相似的。但是,在“列表形状”没有变化的情况下,我会map
和mappend
:
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