F [G []オブジェクトに機能:Scalazモナドトランス。適用F1:A => G [B]、F2:B => G [C] Iは、2つ(またはそれ以上)の関数として定義した
val functionM: String => Option[Int] = s => Some(s.length)
val functionM2: Int => Option[String] = i => Some(i.toString)
私は李ない
data.map(_.flatMap(functionM).flatMap(functionM2))
res0: List[Option[String]] = List(Some(3))
:私の質問は以下のような結果を得るために(良い方法で)機能を構成する方法です
val data: List[Option[String]] = List(Option("abc"))
:私はのように定義されているいくつかのデータをも持っています上記の関数呼び出しの構文を使用してください。私はこのような多くの場所がある場合、コードは非常に判読不能です。
私はOptionT scalazのモナド変換子と遊ぶことを試みたが、それはまだマップを入れ子にしても同様のネストされたオプションを生成しています
OptionT(data).map(a => functionM(a).map(functionM2)).run
res2: List[Option[Option[Option[String]]]] = List(Some(Some(Some(3))))
私は何を達成したいことは、多かれ少なかれ、このようなものです:
をSomething(data).map(functionM).map(functionM2)
またはより良い:
val functions = functionM andThenSomething functionM2
Something(data).map(functions)
試してみるといいですね。私はscalazがTryTモナドトランスを持っていないことを知っているので、Tryで動作する関数をうまく構成する方法はありますか?
'Kleisli(functionM)> => Kleisli(functionM2)'を使って 'val function = functionM andThenSomething functionM2'を達成できますが、これで次に何をするのか分かりません... –