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

Clojureにおける関数の部分適用について

Clojure

取る引数が複数あって、どれかだけ固定して残りはまだ引数になってる(説明の仕方が悪い)ようなときにはpartial関数が便利。"+"とか"*"のような順序を交換しても結果が変わらないような関数に関してはpartialはとても便利なのだが、"-"とか"/"とかはどっちを固定するかで結果が変わってくる。一箇所だけ固定して残りは無名関数で返せばそれはそれで仕事が終わりなのだが、なんか面倒。と、思ったらpartialの変種版があるようでそちらを使えば解決しそうだ。

;; (use '[clojure.contrib.str-utils2 :only (partial)])
;; ぶつかるのに注意が必要な気がする
((clojure.core/partial / 3) 6) ; 1/2
((clojure.contrib.str-utils2/partial / 3) 6) ; 2
((clojure.core/partial str "a") "b" "c" "d") ; "abcd"
((clojure.contrib.str-utils2/partial str "a") "b" "c" "d") ; "bacd"

(defn three-terms [a b c]
  (str a b c))
(three-terms "a" "b" "c") ; "abc"

;; 任意のところをfixするには...?
(defn fix-first-and-third [a c]
  #(three-terms a % c))
(fix-first-and-third "a" "c") ; #<user$fix_first_and_third$fn__15462 user$fix_first_and_third$fn__15462@70f28b3a>
((fix-first-and-third "a" "c") "b") ; "abc"

任意の位置であれこれしたければやはり関数を返すような関数を自分で作るしかないのかなー。

それにしてもなぜstr-utils2に入っているのか謎い。。。