(この記事ははてなブログ http://mmyymmdd.hatenablog.com/ の再掲です)
2015-04-12
きょう、いわゆる検索関数 "find_pred" を追加した。Haskell_1_Coreモジュールに入れている。
Function find_pred(ByRef pred As Variant, ByRef vec As Variant) As Variant
対象配列の中から条件に合致する値を探す関数で、第1引数のpredは検索における条件指定の述語で、第2引数のvecは対象配列だ。
自由度の高い**pred
**を簡単に生成できるかどうかが検索の使い勝手を決めると思う。「指定した範囲に含まれる」とか「素数である」等の条件を述語オブジェクトとして生成するときに、いちいちヘルパ関数を定義したりするのは面倒なのでやりたくない。1
**find_pred
**は単にループを回しているだけだが、合成関数の作成と呼び出しが簡単なので、シンプルに実装できた。
これを使って乱数列の中からある範囲内の数値を探すコードはこうなる。2
Points = mapF(p_rnd(0), repeat(100, 10000))
pred = p_mult(p_greater( , 29.9), p_less( , 29.99))
m = find_pred(z, Points)
こう書くと pred
は 29.9 < x かつ x < 29.99 を満たす x に1を、そうでない x に0を返す関数になる。ラムダ式のような自由と柔軟さはないが、C++03でbind1st
やbind2nd
を組み合わせて生成するよりはマシかもしれない。
ところで引数の順序が find_pred(pred, vec)
とするか find_pred(vec, pred)
とするか決め難かった。とりあえず述語を前にしたが、ソート関連の関数3では比較関数が後になっている。
VBAHaskellの紹介 その5 (関数のシグネチャ)
VBAHaskellの紹介 その3 (FizzBuzz)
VBAHaskellの紹介 その2 (合成関数)
VBAHaskellの紹介 その1 (最初はmapF)
ソースコード:https://github.com/mYmd/VBA