2007-08-01から1ヶ月間の記事一覧

副作用のあるArrowの自作 1

副作用のあるArrowを自作してみます。id:MaD:20070816#1187319817で作ったやつは実用性がないので、新しい題材としてストリームに対してのシーケンシャルアクセスを記述するためのArrowを作ってみます。 簡単の為、これから作るArrowの基本動作は以下の2つだ…

FizzBuzz

TraversableでもFizzBuzzに再び挑戦。Haskellに見えない。 import Data.Traversable main = for [1..] (\i -> if (i `mod` 15 == 0) then putStrLn "FizzBuzz" else if(i `mod` 3 == 0) then putStrLn "Fizz" else if(i `mod` 5 == 0) then putStrLn "Buzz" …

Haskellで多重forループを書く

ArrowとかApplicativeとかTraversableとかいろいろ使ってコードを書いてみたいなということで、どう書く?orgに登録しました。とりあえずforループで4つほど書いて見ました。おもしろかったのは、ピラミッドを作ると逆順になるあみだくじ。自然に2重ループが…

Data.Traversable.for

おもしろそうだったので、Traversable.forについて少し調べました。Data.Traversable.forはモナドに対してはmapMと同じ挙動をします。 for [1..10] print と mapM print [1..10] は同じです。例えばリストモナドだとこういう事ができます。 > for [1, 2, 3, …

Arrowの柔軟性

id:MaD:20070820で書いたmapAの問題点ですが、ArrowLoopはそれを解決してくれるものではありませんでした。IOモナドやMonadFixについて勉強不足なので、これらについてしっかりと理解出来てはいないです。 問題が起こるのは、IOモナドとかStateモナドとか副…

おもしろそうなモジュールのメモ

Data.Traversable Data.Foldable Data.Sequence Control.Applicative Control.Monad.Instances Data.Monoid (Applicative内で使っている) 例えば import Control.Applicative import Data.Traversable main = for [1..10] (\i -> print $ "hoge" ++ show i) …

ArrowでFizzBuzz(とArrowの再帰に関する問題点)

ふと、Arrowを使ってFizzBuzzが簡単に書けるかなと思ったので書いてみました。結論から言うとあんまり書きやすくはなかったです。ソースコードもちろんif then elseレベルで自分で実装をしているからでして、ライブラリが充実してくればそんなに書きにくいも…

Arrowパズル解答 (とArrowLoop解説)

まず最初にArrowLoopについて説明します。数学的な話は一切しません(できません)。 ArrowLoopの仕組み ArrowLoopというクラスにはloopという関数が一つだけ属しています。このloopはArrowから新しいArrowを作り出してくれる関数です。 まずloopに入れるArrow…

Arrowパズル

このまえ書いたArrowLoopで階乗を計算するサンプルが全然Arrowらしくなかったので、ArrowらしいArrowLoopのサンプルを書いてみます。 初級編 ??? = loop (snd &&& uncurry(:)) ??? = loop (snd &&& uncurry(++)) ??? = loop $ snd >>> id&&&(id&&&tail >>> u…

Arrowの心

昨日の続きです。記法がよいとかMonadみたいに副作用が扱えるとか言ったメリットをはるかに越えたArrowの素晴らしさについて紹介します。 reverse.reverse == id か? 自分が最初にArrowってすごいと気づいた問題がこれです。大学で同級生と話している時に気…

Arrowでクイックソート

久しぶりに書きます。この1ヶ月半ほどは、大学の試験があったり、塾の夏期講習をやったり、CPU実験が始まった(勝手に始めた)りしたのでブログの事をすっかり忘れてました。んで、現在Haskellでコンパイラを製作なんかをしています。その為にHaskellの勉強を…