No Programming, No Life

プログラミング関連の話題や雑記

Clojureで関数合成してみた

はじめに

id:fitsさんがいろんな言語*1で関数合成を試しておられたので楽しく拝見していたのですが、ふとClojureがないことに気付きまして、それじゃあClojureでもやってみようと思いこれを書いています。
Groovy, Scala, F#, Haskell による関数・クロージャの合成 - なんとなくな Developer のメモ

(動作確認 Clojure 1.2.0)

compose-sample.clj

(def plus #(+ % 3))
(def times #(* % 2))

; 適用順は右から
(def f (comp times plus))
(def g (comp plus times))

; (times (plus 4))
(println (f 4)) ;=> 14
; (plus (times 4))
(println (g 4)) ;=> 11
  • #(...)は無名関数。%が暗黙の引数(1つのみの場合)。引数が複数ある場合は%1, %2, %3...となる。
  • Clojureのcomp関数は適用順が右からなのに注意する。

*1:Groovy, Scala, F#, Haskell