Monad

STはState Transformerとは言うけれど

少し前に巷ではやったSTのことを勉強してみました。原典のLazy Functional State Threadsをかじってみました。僕はStateモナドはなんとなく自分でかけるくらいまで理解していたのですが、STは使ったこともないし、いったい何物なんだかぜんぜん知りませんで…

Data.Treeを初期化する方法を工夫してみた

詳しいことはそのうち書くとして、ReaderモナドとStateモナドの違いなんかを考えているうちにXMLやHTMLの記述を簡略化するDSLみたいなものがあったらいいなと思ったりしていたら、どちらのブログかは失念してしまったのですが、たしかmoeというライブラリが…

関数じゃなくてもモナドになれる

また、間が開いちゃったんですが、少し前にどんな関数でもモナドになれる件をかいたのですが、今回、さらに一歩進めて、ただの値でもモナドになることを書きたいと思います。ということでこちら: newtype V a = V {unv :: a} instance Monad (V) where retu…

モナドの分類

モナド型クラスに属する型はいろいろとあって、その中にはさらにMonadPlusをサポートするモナド型があったり、そうでないものがあったりするわけで、これはつまりいろいろなモナド型を2種類に分類しているわけですよね…IO (Maybe a)という型のモナドのコー…

実は関数もモナドとして捉えることができる

関数(a->b)はそのままArrowのインスタンスになっているわけなんですが、実はモナドのインスタンスとしても機能できることに気づきました…ステートモナドとかを見れば何の秘密にもなっていないことなんですが…「関数もモナドのインスタンスとして扱える」とい…

PEG電卓をやってみた

前回のポストから日数がたってしまいましたが、たまにはちゃんと最後まで書こうということで、出来上がったPEG電卓のコードを乗せておきます。パーサーの定義が前回までのポストとは微妙に変わっていますが、大筋は同じです。こっちのほうがコンパイルして動…

PEGパーサーを書いてみる:後半

前回、シグネチャだけで終わっていたパーサーを実装してみました。 seqP :: Parser i o -> Parser i o -> Parser i o seqP p q = do v ([o] -> Parser i o) -> Parser i o -> Parser i o ifP p ps pf = Parser $ \i -> case (runParser p i) of Nothing -> r…

PEGパーサーを書いてみる

PEGで文法を表現してみて、ルールのそれぞれの使い方動きにもなじみが出てきました。ここで、PEGパーサーをちょっと書いてみたいと思います。PappyやFrisbyのようにO(N)というわけに行くかどうかはわかりませんが…方針としては、Parsecのまねということで、…

遅延IOは可能か

PyTestさんの記事を読んで考え込んでいました。取り上げられていた問題は、ディレクトリを深さ優先探索するコードなわけですが、これをpay as you goでやりたいときにはHaskellではどう書けばよいかというものです。 pay as you goで何がいいたいかというと…

バックトラックとリストモナド

ここ2-3週間、暇を見つけては数独ソルバーをHaskellで書いていました…動くもの自体ができるまではそんなにかからなかったのですが(と、一応言っておいて…)、プロファイルをとりながら高速化していくステップで色々と試行錯誤があって、自分的には「なるほ…

Arowのこと

Haskellを勉強し始めて、モナドのことを知ってちょっとしたころに名前だけ見かけて、実際どんなものなのかを知りたいと思っていたのがArrowです。こちらhttp://www.haskell.org/arrows/で見つけられるような説明を読んだりしたのですが、もう、半年ぐらいち…