VBA

比較関数の自然な例(2)

VBA

昨日の VBAHaskellの紹介 その12 では、5つある問題のうち5番目だけを対象にした。今考えると、元記事 「1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に」 にある問題4 問題4 正の整数のリストを与えられたとき、数を並び替えて可能…

VBAHaskellの紹介 その12 (1時間以内に解けなければプログラマ失格がなんたら)

VBA

今日、表題の記事が話題になっていた。1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に5問あるうち、最後の「問題5」をVBAHaskellでやってみようと思った。 問題5 1,2,…,9の数字をこの順序で、”+”、”-“、またはななにもせず結果が100…

VBAHaskellの紹介 その11 (木構造)

VBA

やっと「すごいHaskellたのしく学ぼう!」の7章まで進んだところ、139ページから始まる二分木の解説の中で、「リストを1要素ずつ辿って値を返す操作はたいがい畳み込みで実装できる」という表現に感銘を受けた。 let nums = [8,6,4,1,7,3,5] let numsTree =…

VBAHaskellでのNull除外

VBA

配列の中のNullを別の値に変換して計算(ここでは乗算)するという単純な事例だが、2通り。 1. いったん Null を 1 に変換した配列を作る。そのあとその配列に対する掛け算をする。内側にある mapF(p_replaceNull(, 1), arr) によって新しい配列が作られてい…

VBAHaskellでのコラッツ数列

VBA

コラッツの問題 - Wikipedia 「任意の正の整数 n をとり、 ・ n が偶数の場合、n を 2 で割る ・ n が奇数の場合、n に 3 をかけて 1 を足すという操作を繰り返すと、どうなるか」 素直にファンクタを作れる。(長いけど)collatz = p_if_else(, Array(p_mod…

VBAHaskellの紹介 その10 (ループの性能が上がらない)

VBA

前回書いたループ性能を改善するためにAPIにそのための関数を追加し、ついでにリファクタリングしてみた。VBAHaskellの紹介 その9 (明示的なループの性能がいまいち) 終了判定されるまで変換関数を繰り返し適用する次のような関数をAPIに追加して、250msか…

VBAHaskellの紹介 その9 (明示的なループの性能がいまいち)

VBA

ここでの「明示的なループ」とはVBAコード中のループのことで、VBAHaskellの関数適用関数である applyFun 等を繰り返し呼び出したときの性能が良くない。mapFやfoldlなどのリスト処理関数でもループ処理はしているが、それはdllの中で行われているのでこの話…

比較関数の自然な例

VBA

ソートで使用する比較関数のうまい例がみつからない。 列 { Xn } をソートするのに、関数 f でマップした f(Xn) の大小関係で比較することは良くあり、そのときの比較関数は [ ] ( auto a, auto b) { return f(a) < f(b); } という内容のものになるだろう。 …

VBAHaskellの紹介 その8 (ソート関連)

VBA

ソート関連は別にHaskellぽくない。特徴と言えるのは任意の比較関数が使えることくらいだ。 関数は8つ、Subがひとつある。 sortIndex 昇順ソート後のインデックス配列sortIndex_pred 任意の比較関数によるソート後のインデックス配列 permutate (Sub) 配列…

VBAHaskellの紹介 その7 (bind1stとbind2nd)

VBA

VBAHaskellにbind1stとbind2ndを追加した。C++の<functional>にあるのとだいたい同じだが、VBAHaskellにおいては関数は初めから何らかの形で束縛されているので、あまり使う場面はないと思う。意味的には引数の"再"束縛なので rebind と名付けるべきなのかもしれない。プ</functional>…

VBAHaskellの紹介 その6 (foldl)

VBA

VBAHaskellで実装しているfoldlは本物のHaskellと同様に、「2引数関数」、「初期値」、「対象リスト」の3つの引数を取る左畳み込み関数だ。VBAでラップはしておらず、Haskell_0_declareモジュールに宣言しているC++ API *1 をそのまま使う。 Declare Functio…

VBAHaskellの紹介 その5 (関数のシグネチャ)

VBA

VBAHaskellはVBAの関数を合成して独立したオブジェクトにしたり、Haskell的なリスト処理をするライブラリだが、それが可能なVBA関数のシグネチャは実質的に1種類しかない。 Function myFunction(ByRef a As Variant, ByRef b As Variant) As Variant または …

VBAHaskellの紹介 その4 (Find)

VBA

きょう、いわゆる検索関数 "find_pred" を追加した。Haskell_1_Coreモジュールに入れている。 Function find_pred(ByRef pred As Variant, ByRef vec As Variant) As Variant 対象配列の中から条件に合致する値を探す関数で、第1引数のpredは検索における条…

VBAHaskellの紹介 その3 (FizzBuzz)

VBA

2015-07-10前のよりずっとわかりやすいFizzBuzzができたので書く。というより下の記事を書いたときは寝ぼけていたとしか思えない。 ' 分かりやすいFizzBuzz fun3 = p_if_else(, Array(p_mod(, 3), placeholder, "Fizz")) fun5 = p_if_else(, Array(p_mod(, 5…

VBAHaskellの紹介 その2 (合成関数)

VBA

続いて関数合成について。 VBAでももちろん関数を合成して計算することはできるが、関数型言語のように合成関数自体を変数に入れたり関数から出力したりすることはできない。 例えばLog(0.1 + Abs(x-5))という計算を多数のxに対して行う場合、普通はこの式を…

VBAHaskellの紹介 その1 (最初はmapF)

VBA

VBAHaskellはHaskellを真似たVBAのライブラリである。 リスト処理系の関数や関数合成などの機能によって退屈な繰り返し処理を減らし、VBAをより面白くするのが目的だ。 その中でもmapFはコアとなる関数で、リンクしたgithubにあるHaskell_1_Coreモジュールの…

HaskellVBAの関数呼び出しの構造を変えた

VBA

関数合成がかなり自然な形に書けるようになったぞ! mYmd/VBAgithub.com

使い方のまとめ

VBA

自分もVBAHaskellの使い方解説を少しずつやっていこう。 とりあえず明日からだ。

HaskellVBA

VBA

モジュール構成を整理し、名称を大幅に変更した。unfoldrはいまいちパッとしないので、代わりに以下の4つの関数を追加した。 repeat_while : 述語による条件が満たされる間繰り返し関数適用 repeat_while_not : 述語による条件が満たされない間繰り返し関…

VBA での関数型プログラミング

VBA

昨日のことだが、VBA で関数型プログラミングを試みている人々がいることが分かったのでフォローしてみた。 F#がベースのようだが、F#は全然知らないので今はなんとも評価できない。

VBA上で動くなんちゃってHaskell

VBA

以前TwitterでもつぶやいたVBA上で動くなんちゃってHaskell、面白いと思って作ったものだけど、急激につまらなくなってしまった。 mYmd/VBA mapやzipWithやfoldやscan系の関数を真似する事で、かなりループを排除できるようになったし、引数の束縛やらmapや…