VBA

前回記事 VBAHaskellの紹介 その15(引数の部分文字列のリストを取り出す) で、問題を解くためのアドホックな関数を定義して使ったことを不満点としてあげた。 VBAHaskellで実装している関数合成はスコープがフラットで、すべてのプレースホルダに実引数を…

VBAHaskellの紹介 その15(引数の部分文字列のリストを取り出す)

VBA

「関数プログラミング実践入門」に記載されている問題についての解説記事を別のところで見かけた。解説が面白かったし、VBAHaskellで実装を試みるのに手頃だったのでやってみたが、あまりいい結果にはならず課題が残った。 segments という関数で、引数に文…

VBAHaskellの紹介 その14(変数のムーブ)

VBA

Haskellと全く関係ない話題だが、VBAHaskellでは効率上の理由からVariant変数のムーブ・セマンティクスを実装して利用している。APIにある moveVariant 関数だ。*1効率とは、関数で配列を返す時に発生するローカル変数のコピーなどのことである。 ' 0 から n…

ネストした関数を可視化するユーティリティ

VBA

2015/4/16の記事 VBAHaskellの紹介その7(bind1stとbind2nd) で記述に誤りがあった。bind1stとbind2ndの中身がどうなっているかの説明で、bind1stで上書きされない変数を上書きされると間違えていたのだ。VBAHaskellの関数は配列なので直接見えないし、ネス…

VBAHaskellの紹介 その13 (プレースホルダの追加: _1 と _2 )

VBA

VBAHaskellで2変数関数を合成するときの自由度を高めるために新しいプレースホルダ ph_1 と ph_2 を導入した。これの直接のきっかけは以下の問題 *1 を解くことだった。 問題4 正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記…

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

VBA

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

constexprカウンタ

C++

きのうtwitter上で紹介されていた、いわゆるconstexprカウンタのコード。 <a href="http://melpon.org/wandbox/permlink/Ddng0P1vvVkBTUlt" data-mce-href="http://melpon.org/wandbox/permlink/Ddng0P1vvVkBTUlt">[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ</…

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#は全然知らないので今はなんとも評価できない。

シェルスクリプトマガジン

Amazon.co.jp: シェルスクリプトマガジン vol.24: 當仲寛哲, ちょまど, 大内智明, 白羽玲子, 上田隆一, 熊野憲辰, 波田野裕一, 濱口誠一, すずきひろのぶ, 水間丈博, 菅雄一, 大岩元, 鳥居高之, 後藤大地, 法林浩之, 濱田康貴, USP研究所, ジーズバンク: 本…

ガス給湯器やっと修理完了

日曜日の夜から故障して動かなくなっていたガス給湯器が今日の午後の修理を受けてやっと稼働するようになった。 本体部分ではなく、周りのパイプなどの部品交換だったのだが、本体交換時にはそれらは廃棄物になってしまうらしい。たとえそれが明日だったとし…

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

VBA

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

突然のコンパイルエラー

C++

clangでもgccでもVCでもコンパイルできていたのに、突然エラーが出るようになった。 rbind/rbindv.hpp at master · mYmd/rbind · GitHub これは可変長テンプレートの学習を兼ねて作成した自作のbind関数で、ラムダ式が導入されてからはほぼ無用の長物と化し…