Written June 10, 2013 Note: before reading this, you should know what a monad is. Read this post if you don't! Here's a function half: And we can apply it a couple of times:
30分プログラム、その670。Writerモナドを試してみました。 前回がReaderモナドだったので、今回はWriterモナドを試してみました。 The Writer monadには、Writerモナドは裏でログをとったりするのに便利だと書いてあったので、関数の呼び出しを記録してみました。 使い方 *Main> runWriter $ fib 10 (55,["fib(10)", "fib(9)", "fib(8)", "fib(7)", "fib(6)", "fib(5)", "fib(4)", "fib(3)", "fib(2)", "fib(2)", "fib(3)", "fib(2)", ....]) とやって、普通のフィボナッチ数の定義が、いかに非効率かに驚く。 そのあと、 *Main> runWriter $ fibi (1,0) 10 (55,["fibi(10)","fi
モナドの合成はさっぱりわからないままだったので、試しにReaderモナドとWriterモナドの合成をやってみた。 リーフは数値、ブランチにはラベルがついてる木構造データを対象に、 木構造データのリーフの合計を求める関数 さらに、Writerモナドを使って足したリーフの数字を順番にログにとる関数 さらに、Readerモナドを使って親のラベルもログに取る関数 の順番で変更が少ないように実装してみたつもり。それぞれmain1,main2,main3に対応する。これでちゃんと動く理屈はあまりちゃんとわかってない。わかったら後で書く。 以下ソース data T = B String [T] | L Int sample = B "root" [L 5,B "child" [L 1,L 10],L 2] -- main1 = sum_leaf sample sum_leaf (L n) = n sum
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く