0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VBAHaskellの紹介 その4 (Find)

Last updated at Posted at 2015-04-30

(この記事ははてなブログ 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でbind1stbind2ndを組み合わせて生成するよりはマシかもしれない。
ところで引数の順序が find_pred(pred, vec) とするか find_pred(vec, pred) とするか決め難かった。とりあえず述語を前にしたが、ソート関連の関数3では比較関数が後になっている。

VBAHaskellの紹介 その5 (関数のシグネチャ)
VBAHaskellの紹介 その3 (FizzBuzz)
VBAHaskellの紹介 その2 (合成関数)
VBAHaskellの紹介 その1 (最初はmapF)

ソースコード:https://github.com/mYmd/VBA

  1. もちろん込み入った条件を定義するには個別に関数を定義した方がいい

  2. test_moduleのSub vbaUnitにサンプルがある

  3. sortIndex_pred、lower_bound_pred、upper_bound_pred、equal_range_pred

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?