2009-05-01から1ヶ月間の記事一覧

自然変換の例

『関数プログラミング』の 8.4 に抽象型についての説明があったんだけど、抽象化関数 abstr がそのまま自然変換になってる。こっちには全射(surjective)の条件が必要だけど・・・。 ユーザ定義の (list α) 型と組み込みのリストとの対応関係とか。 抽象化関数…

RAII なクラス

C#

あると便利なこともあるので作ってみた。 public class Raii : IDisposable { Action action; public Raii(Action action) { this.action = action; } public void Dispose() { action(); } } Form form; form.SuspendLayout(); using (Raii r = new Raii(()…

"青"と"白"と"ε"だけの圏

とか考えたんだけど、なぜかうまく作れない。 対象: "青"か"白"かε 射: "青"と"白"と"ε"で作られるしましま。 域: 最初が"青"の場合は"青" 最初が"白"の場合は"白" 最初が"ε"の場合は"ε" 余域: 最後が"青"の場合は"白" 最後が"白"の場合は"青" 最後が"ε"の場…

足し算の圏

対象が N の足し算てどうするんだろうと電車に揺られながら考えた結果、 対象: N 射: (n,m) dom((n,m)) = n cod((n,m)) = n+m id(n) = (n,0) ; : (n1,m1);(n2,m2) = (n1,m1+m2)Multiplicative Transition の例と似たような感じになたー。 しかし恒等射がなん…

モニャモニャモナド行ってきた

off

圏について全く知識が無い状態で行ってきましたが、今回は圏の具体的な例をいっぱい出す回だったので、その具体的な圏については何となく分かった気分になれました。 composable とか 聞いてて重要そうなのが composable のような感じ。 この条件があるから…

モニャモニャモナド

off

告知:「技術者/プログラマのためのモナドと圏論」セミナー(モニャドセミナー) 第2回 - 檜山正幸のキマイラ飼育記 (はてなBlog) に参加登録をしてみました。 第2回のセミナーで、しかも自分は Haskell とか圏論とかについて全然知らない C++ な人なのでほ…

TMP で Maybe モナド

namespace monad { namespace maybe { struct nothing { }; template<class A> struct just { }; template<class A> struct ret { typedef just<A> type; }; template<class M, template<class> class F> struct bind; template<class A, template<class> class F> struct bind<just<A>, F> { typedef typename F<A>::type …</a></just<a></class></class></a></class></class>

inits, scan

メタプロは続くよどこまでも。 // inits // リストのすべての先頭部分リストを長さの増加する順に並べたリストを返す // [α]→[[α]] namespace inits_detail { template<class L1> struct concat_bind { template<class L2> struct f { typedef typename binary_concat<L1, L2>::type type</l1,></class></class>…

zip

こんなのを思いついた。 template<class Pair> struct zip; template<class... S1, class... S2> struct zip<pair<tuple<S1...>, tuple<S2...>>> { typedef tuple<pair<S1, S2>...> type; }; ……けど S1 と S2 の長さが違うとアウトでしたorz なので take を実装して長さを短いほうに合わせてからやってやるといけそうな感じ。 追記: でけ</pair<s1,></s2...></pair<tuple<s1...></class...></class>…

RTTI を使わずに Boost.Any を実装する方法

Boost.Any は any_cast<> 内で type_info を使って変換しようとしている型が一致しているかどうかを判断してるんだけど、RTTI を使いたくないので type_info を使わずに any を実装してみる。 これは要するに型単位でユニークな値が取れればいいだけなので、…

Boost.Function とか Boost.Bind を組み込み環境向けに移植してみた

といっても BREW で使えるようにしただけなので他の環境で使えるかどうかは知りません。 あとバイナリサイズがどうなっても知りません(といっても自分で関数オブジェクト作って格納して呼び出した場合のコードサイズと大して変わらない気もしますが)。 以…

function_allows_small_object_optimization

というメタ関数が boost/function/function_base.hpp に定義されています。 これが何かというと名前の通りで、このメタ関数が true を返す場合には、boost::function に渡す関数オブジェクトが十分に小さい(かつ正しい場所にオブジェクトが配置できる)ので…

intrusive_ptr を楽に定義する

C++

template<class Derived> class intrusive_ptr_facade { friend Derived; std::size_t ref_; friend inline void intrusive_ptr_add_ref(Derived* p) { ++static_cast<intrusive_ptr_facade<Derived>*>(p)->ref_; } friend inline void intrusive_ptr_release(Derived* p) { if (--static_cast</intrusive_ptr_facade<derived></class>