ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Scalaコミュのデータフローsyntax: input -> func1 -> ...funcN -> output の実現

  • mixiチェック
  • このエントリーをはてなブックマークに追加
ちりとてちん。
Scala list <scala@listes.epfl.ch>からの話題です。

input -> func1 -> func2 -> func3 -> output

といった一種のデータフローを素直に表わすSyntaxの導入が
Scalaだと簡単に定義できます。inputとoutputは値で
あとは関数をジュズつなぎにします。

普通は、Scalaに用意されている関数合成を意味する'andThen'
 f andThen g (x) ====> g( f(x) )
を使って
val result = (func1 andThen func2 andThen func3)(input)
なんて風にやるわけですが、これだとまだデータフローっぽくありません。

そこで、演算子がメソッドとしてどんどん定義できるScalaの活躍です。

case class Function1WithLeftInput[-T1,+R](f: (T1) => R) {
def ->:(input: T1) = f(input)
def ->:[A](e: (A) => T1) = (e andThen f)
}

として ->: を定義しておきます。

ちなみに、Scalaでは、お尻に:の付いているメソッドは
right-associativeとして処理されます。ですから、
a ->: b ->: c ====> a ->: (b ->: c)と解釈されます。


次に、例の暗黙の型変換の登場(暗躍!)です。
これによって、普通に1引数関数が登場したら
それを無理やり左入力関数として解釈しなおします。

implicit def function1ToLeftInput[T1,R](f: (T1) => R) =
Function1WithLeftInput(f)

これらの定義だけで、次のような計算がinput -> func1 -> ...funcN -> output
形式で実行可能になります。

val f = {x: Int => x + 1 }
val g = {x: Int => x * 3.3 }
val h = {x: Double => x + 0.1 }

and write pipelines in the form
val result = 4 ->: f ->: g ->: h

result: Double = 16.6

コメント(0)

mixiユーザー
ログインしてコメントしよう!

Scala 更新情報

Scalaのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング