7

代わりに、複数の操作についても同様にxs map f map g書く方が効率的です。xs map { x => g(f(x)) }filter

2 つ以上flatMapの s が連続している場合、それらを 1 つに結合する方法はありますか?それはおそらくより効率的ですか? 例えば

def f(x: String) = Set(x, x.reverse)
def g(x: String) = Set(x, x.toUpperCase)

Set("hi", "bye") flatMap f flatMap g  
  // Set(bye, eyb, IH, BYE, EYB, ih, hi, HI)
4

3 に答える 3

11
于 2012-09-02T10:20:23.450 に答える
5

scalaz ではa -> m band b -> m cintoのような関数を構成する方法がありa -> m cます (ここでの関数 from StringtoのようにSet[String])。ちなみに、それらはクライスリ関数と呼ばれます。haskell では、これは>=>これらの関数で簡単に実行できます。scala では、もう少し冗長にする必要があります (ちなみに、例を少し変更しましSetList

scala> import scalaz._, std.list._
import scalaz._
import std.list._

scala> def f(x: String) = List(x, x.reverse)
f: (x: String)List[String]

scala> def g(x: String) = List(x, x.toUpperCase)
g: (x: String)List[java.lang.String]

scala> val composition = Kleisli(f) >=> Kleisli(g)
composition: scalaz.Kleisli[List,String,java.lang.String] = scalaz.KleisliFunctions$$anon$18@37911406

scala> List("hi", "bye") flatMap composition
res17: List[java.lang.String] = List(hi, HI, ih, IH, bye, BYE, eyb, EYB)
于 2012-09-02T20:09:54.257 に答える
2

フィルターについて説明したアプローチは、基本的に中間コレクションの作成をスキップします。

flatMap少なくとも内部コレクションは関数内で作成されるため、関数を変更せずにその作成をスキップする方法は想像できません。

あなたが試すことができるのは、ビューを使用することですが、これがflatMapで役立つかどうかはわかりません。

multiFlatMapまたは、関数から返された中間コレクションを新しいコレクションに詰め込むことなく、関数の結果から直接最終的なコレクションを構築する を構築することもできます。

これが実行可能かどうかはわかりません。各関数が次の関数の入力型である A の Collection を返す関数の Seq を渡す必要があるため、少なくともいくつかの深刻な型の課題が発生していると思います。少なくとも、任意の型と任意の数の関数の一般的なケースでは、これはやや難しいように思えます。

于 2012-09-02T06:53:15.110 に答える