読者です 読者をやめる 読者になる 読者になる

Groovy, Scala, F#, Haskell による関数・クロージャの合成

Groovy 1.8 のクロージャ合成の機能を試したついでに、Scala, F#, Haskell での関数合成の機能も簡単にまとめてみました。

サンプルのソースコードhttp://github.com/fits/try_samples/tree/master/blog/20101213/

Groovy の場合

Groovy では >> や << を使います。(1.8 から導入された Closure composition の機能)

  • Groovy 1.8.0 beta2
compose_sample.groovy
def plus = {x -> x + 3}
def times = {x -> x * 2}

def f = plus >> times
def g = plus << times

// times(plus(4)) = 14
println f(4)
// plus(times(4)) = 11
println g(4)

Scala の場合

Scala では andThen や compose 等を使います。

compose_sample.scala
val plus = (x: Int) => x + 3
val times = (x: Int) => x * 2

val f = plus andThen times
val g = plus compose times

// times(plus(4)) = 14
println(f(4))
// plus(times(4)) = 11
println(g(4))

F# の場合

F# では Groovy と同様に >> や << を使います。

  • F# 2.0.0
compose_sample.fs
let plus x = x + 3
let times x = x * 2

let f = plus >> times
let g = plus << times

// times(plus(4)) = 14
printfn "%i" (f 4)
// plus(times(4)) = 11
printfn "%i" (g 4)

Haskell の場合

Haskell では . を使います。

  • HaskellPlatform 2010.2.0.0 (GHC 6.10.4)
plus x = x + 3
times x = x * 2

f = times . plus
g = plus . times

main = do
    -- times(plus(4)) = 14
    putStrLn $ show $ f 4
    -- plus(times(4)) = 11
    putStrLn $ show $ g 4