(この記事ははてなブログ http://mmyymmdd.hatenablog.com/ の再掲です)
2015-04-11
##続いて関数合成について。
VBAでももちろん関数を合成して計算することはできるが、関数型言語のように合成関数自体を変数に入れたり関数から出力したりすることはできない。
例えば Log(0.1 + Abs(x-5))
という計算を多数のxに対して行う場合、普通はこの式を埋め込んだユーザー定義関数を作る。
しかしVBAでもラムダ式もしくはファンクタのようなものを作れれば便利だし、ぜひともそれを前回紹介した mapF に渡せるようにしたい。そうしないとライブラリに渡すためのヘルパ関数をその都度作るハメになるからだ。
そこでパーツを適当に組み合わせてファンクタを作れるようにした。
a = p_log(p_plus(0.1, p_abs(p_minus(, 5))))
これはC++風に書くと下式に相当する。
auto a = [](auto x) { return Log(0.1 + Abs(x-5)); }
Haskellだとこう(?)
a = \x -> log(0.1 + abs(x-5))
パーツである p_log, p_plus, p_abs, p_minus はあらかじめ用意 1 してあり、それぞれはVBA上の関数(のポインタ的なもの)である。
このa に対して、mapF(a, iota(1, 10))
とか applyFun(4, a)
といった式で実際に計算させることができる。
残念ながら表現力には限界があって、演算子を組み合わせてもっと自然にこう書くことはできない。
a = p_log(0.1 + p_abs(p_minus(, 5)))
⇐ ダメ
VBAHaskellの紹介 その3 (FizzBuzz)
VBAHaskellの紹介 その1 (最初はmapF)