読者です 読者をやめる 読者になる 読者になる

VBA

place_fill 関数の追加(VBAHaskell)

VBA

VBAHaskellにplace_fill という関数を追加して Haskell_2_stdFun.bas モジュールに置いた。 1次元配列内の指定した複数の位置に関数もしくは定数値を適用して、その場所に値を埋めるものだ。 埋めたあと配列そのものをmoveして返す。 ' 配列の特定位置に関数…

Collectionのソート

VBA

t-homさんの記事 thom.hateblo.jp に言及されていた以下の記事にコメントを書きました。 kantoku.hatenablog.com 「コレクションのソートが面白そうなので考えてみたい。」という趣旨のコメントで、一応作ってはみたのですが、Collectionを使ったことがなか…

SQL Server メモ

VBA

SQL Server Express に日経平均株価のヒストリカルデータテーブルをCREATEして、データをINSERTしたときのメモ。 VBAHaskellとvb_ODBC.clsを使用。 1.データの準備 日経平均株価 日足 時系列データ CSVダウンロードから各年のCSVファイルをダウンロードして…

VBAHaskellの改修まとめ

VBA

最近VBAHaskellにいくつか変更をしたのでまとめの記事を書きます。 VBAHaskell全関数リファレンス → VBAHaskell_reference 1. API関数self_zipWithを追加しました 次のようなシグネチャの関数をHaskell_0_declare.basの一番下に追加しました。 ' 1次元配列の…

clone ⇒ swap ⇒ edit ⇒ swap

VBA

VBAHaskellのC++側APIにふたつの関数を追加した。VBAのクラスインスタンスを操作する時のイディオムである swap と clone を実装するのに使う。 (今回もHaskell的な要素はまったくありません。) 以下ではswap は自身の属性と他のオブジェクトの属性をまる…

VBAHaskellリファレンス

VBA

VBAHaskellの関数リファレンスページを作成した。 作り方がよくわからないので、Excelをそのまま htm ファイルにしただけ。 http://home.b07.itscom.net/m-yamada/vh_Manual/VBAHaskell_reference.htm

VBAHaskell ユーティリティを使ってみる

VBA

先日の記事VBAHaskell ユーティリティ群で書いたユーリティティモジュールは、その後いろいろ関数を追加し、記事にも反映した。 サンプルとして、このところ動きの激しい株価データにごく簡単なデータ処理をしてみよう。 まずYahoo!ファイナンスのページから…

VBAHaskell ユーティリティ群

VBA

先日の記事でVBAHaskellに数学関数を入れ始めたが、案の定その後が続かず放置状態になっている。とりあえず気にせずにユーティリティ関数群を追加する事にした。既存の関数のシンタックス・シュガーや特定の集計作業を便利にするための関数の寄せ集めだ。(…

数学関数を入れ始める

VBA

VBAHaskellには数学関数がまだない。四則演算、指数関数、対数関数、多項式、min、max 程度が Haskell_2_stdFun にあるのと、乱数生成機が misc_random にあるだけだ。 とりあえず数学関数を少しずつ書いていくためのbasファイルを追加した。 VBA/misc_math.…

mbind(std::bindのメタ関数版)

VBA

std::bind は<functional>ヘッダにあるC++11の標準ライブラリで、関数やラムダ式など operator() で呼び出すことが可能なオブジェクト(Callable)に対し、引数を部分的に束縛(bind)するものだ。「呼び出し」とは実行時の関数呼び出しのことであり、引数は値である。 ここ</functional>…

VBAHaskellでのコラッツ数列(その2)

VBA

以前この記事で コラッツの問題 - Wikipedia にある数列をVBAHaskellで生成するというのをやってみた。 mmyymmdd.hatenablog.com 今回は、多倍長整数を使ってもっと多くの初期値で試してみた。 このついでに以下の3つのモジュールに変更をしたので、その気が…

アッカーマン操作

VBA

今読んでいる本 『コンピュータは数学者になれるのか? 数学基礎論から証明とプログラムの理論へ (照井一成)』の155ページに アッカーマン操作 というものが登場した。Ackermann関数の数列版みたいなものである。 非負整数の有限列<...>に対して次のような…

2つの表を比較する

VBA

また人様のネタを頂戴する。 整数からなる列がふたつあり、それぞれ 表A、表B とする。それぞれ片側にしかない数字を抽出しようというものだ。 vbaHaskellで短く書くとこうなる。ただし値ではなく、ある/ないの結果を 1 / 0 で表示した。 ab = unZip(mapF(p…

3つの引数を持つ関数

VBA

VBAHaskellで3つ以上の引数を持つ関数をファンクタ化したい。 APIのレベルでそれをサポートする気は今のところないので、VBA側で簡易的な対応をした。 Haskell_1_Core.bas にそれをサポートする関数 make_funPointer_with_3_parameters を追加した。 'ユーザ…

変数への代入

VBA

VBAで、変数に値を代入してそれを直接別の関数に渡したい。 しかし通常の = による代入を使おうとしたら下記の「方法1」ではダメで、「方法2」のように2行に分ける必要がある。 ' 「方法1」 ? UBound(x = Array(1,2,3)) ' NG、xへの代入ではなく等値比較…

C - 友達の友達(AtCoder Beginner Contest 過去問)

VBA

AtCoder Beginner Contest の過去問題(016 2014/12/06 21:05:00 ~ 2014/12/06 23:05:00)をVBAHaskellでやってみた。 C: 友達の友達 - AtCoder Beginner Contest 016 | AtCoder 問題文 高橋くんはSNSの管理者をしています。このSNSではユーザ同士が友達と…

if_else

VBA

以前qiitaに書いたVBAHaskellにおけるFizzBuzz実装の紹介記事で if_else 関数を使った。 qiita.com ここで if_else 関数自体の説明を書く。 if_else およびこれを関数化した p_if_else はHaskell_2_stdFunモジュールにある。 形式 Function if_else(ByRef va…

ジャグ配列をフラットな配列に展開

VBA

コーへーさんのブログからネタを拝借させていただく。 callmekohei.hatenablog.com すでにthomさんもこのネタで記事を書いているので、VBAHaskellを使って少し違う方向性でやってみたい。 目標 ジャグ配列、たとえば Array(1, Array(2, Array(3, Array(4, Ar…

VBA

t-homさんが直近の記事でByRef As Variantで受けたときにアドレスが変わる事象について仮説を書いている。 thom.hateblo.jp 型一致参照であるShowPtr関数とVariant参照であるShowPtr2関数を作って比較し ShowPtr2でVarPtr(IntArg)としたときは、Variant変数…

ByRef As Variant とは?

VBA

(自分用メモ) VBAでByRef x As Longと宣言された仮引数にLong型以外の実引数を渡すと、「ByRef引数の型が一致しません。」というエラーになる。しかしByRef x As Variantという宣言だったら Variant型以外の実引数、たとえばLong型でも渡すことができる。V…

紹介記事の補足

VBA

t-homさんがVBAHaskellの紹介記事を書いてくれた。 thom.hateblo.jp こんなことは僕の人生初なので、とてもうれしい。 ところでそこにapplyFun2by2関数が取り上げられていて少し驚いた。マイナーな関数だと思っていたからだ。t-homさんにはQiitaでも「before…

VBAHaskellで順列の数え上げ

VBA

n 個の元から k-個を選んで得られる順列の総数は下の式で計算できる。 VBAの適当な配列から、このすべての並びを列挙する関数 nPk をVBAHaskellで書いてみる。 (CallMeKohei さんのつぶやきからネタをパクりましたm(_ _ )m) 関数 nPk に任意の配列と取り出…

最近Qiitaに書いた記事へのリンク

VBA

2015/7/25 最近Qiitaに書いた記事へのリンク VBAHaskellの紹介 その22(イテレータ) - Qiitaqiita.com VBAHaskellの紹介 その21(多倍長整数 bigInt) - Qiitaqiita.com

最近Qiitaに書いた記事へのリンク

VBA

最近Qiitaに書いた記事へのリンク <a href="http://qiita.com/mmYYmmdd/items/cc7515e18338ef0fc765" data-mce-href="http://qiita.com/mmYYmmdd/items/cc7515e18338ef0fc765">VBAHaskellの紹介 その20(有理数の計算) - Qiita</a>qiita.com

VBA 配列でつくったテーブルにSQLっぽいことしてみる(パクリ)

VBA

CallMeKoheiさんのブログ記事「VBA 配列でつくったテーブルにSQLっぽいことしてみる(その2)」をパクってみるという、はなし。 arr = Array(Array(Array("品番", "a"), Array("品名", "apple"), Array("価格", 100#)), _ Array(Array("品番", "b"), Array("…

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 正の整数のリストを与えられたとき、数を並び替えて可能…

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