3

この Scalamachine のプレゼンテーションで Jordan West は関数について明確に語ってい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 7 は Scalaz 6 とは別物だ。

于 2015-09-30T22:20:22.903 に答える
-1

私はmap2scalaz 7 では見つけられませんでしたが、@IK による適用可能なアプローチは、私が考えることができる最も類似したものです。ただし、「リストの形状」が変わらないこの状況では、次のようにmapmappendます。

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

もちろん、型に割り当てられたデフォルトの操作が目的のものでない場合は、Tagscalaz からの終了または 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 に答える