2011-03-01から1ヶ月間の記事一覧

プログラミング Haskell 第9章 対話プログラム その3

今日はライフゲームの実装です。解説はそんなになくてサンプルコードが淡々と出てくるのですが、かなりあっさりとできてしまうという感じです。おそらくライフゲームという題材が関数型プログラミングには向いている(1つ前の状態から次の状態が計算できる)の…

プログラミング Haskell 第9章 対話プログラム その2

今日は電卓プログラムを実装するあたりからです。 seqn :: [IO a] -> IO () -- IO アクションのリストを受け取って順に呼び出す UI としてテキストで電卓のボタンの形を定義 受け付けるキー入力(文字)の定義 いまさらですけど、Haskell では他の言語での定数…

プログラミング Haskell 第9章 対話プログラム その1

プログラミングHaskell作者: Graham Hutton,山本和彦出版社/メーカー: オーム社発売日: 2009/11/11メディア: 単行本(ソフトカバー)購入: 14人 クリック: 503回この商品を含むブログ (117件) を見るまたかなり間があいてしまいました。今日から第9章です。…

プログラミング Haskell 第8章 関数型パーサー その4

ずいぶん長く更新を休みました。この1週間生活リズムに大きな変化があったこともあって朝の読書時間はなしでしたが、合間にちょこちょこと読んで第8章の練習問題をやっていました。後半には BNF による文法規則の表記と構文木を作って評価するパーサーの話が…

プログラミング Haskell 第8章 関数型パーサー その3

(>>=) と do 記法で少し寄り道してしまったので今日はさくさくパーサの組み合わせを読み進めていきます。 連結(これは昨日まで読んだ >>=) 選択(+++) p を使ってみてエラーだったら q を適用 (+++) :: Parser a -> Parser a -> Parser a p +++ q = \inp -> c…

プログラミング Haskell 第8章 関数型パーサー その2

前回はパーサーを連結する演算子の導入したところまででした。 連結演算子で構築するパーサの典型的な形はこんな感じ。lambda をくくるかっこは不要ですが、わたしにとってはまだあったほうがわかりやすいのでくくっています。 p1 >>= (\v1 -> p2 >>= (\v2 -…

プログラミング Haskell 第8章 関数型パーサー その1

プログラミングHaskell作者: Graham Hutton,山本和彦出版社/メーカー: オーム社発売日: 2009/11/11メディア: 単行本(ソフトカバー)購入: 14人 クリック: 503回この商品を含むブログ (117件) を見る第8章は Haskell でパーサーを実装するという内容です。 …

プログラミング Haskell 第7章 高階関数 練習問題その3

8. int2bin, bin2int, make8 は本文中のものをそのまま使っているものとします。また chop9 は chop8 を 8->9 に変更しただけのものです。 parity :: [Bit] -> Bit parity = foldl bitadd 0 addparity :: [Bit] -> [Bit] addparity bits = bits ++ [parity b…

プログラミング Haskell 第7章 高階関数 練習問題その2

今日も 7.8 練習問題を解きます。だんだん読み進めるスピードが遅くなってきてしまいますが、ここはちゃんとやっておいたほうがよさそうなので我慢我慢。5. これは問題文を読んでいるだけではわからなくて ghci で入力してみようとしてやっとわかりました。…

プログラミング Haskell 第7章 高階関数 練習問題その1

今日は 7.8 練習問題を解いてみます。1. ((map f) . (filter p)) xs 2. all _ [] = True all f (x:xs) = if f x == False then False else all f xs または all f xs = foldl (&&) True (map f xs) any _ [] = False any f (x:xs) = if f x == True then Tru…

プログラミング Haskell 第7章 高階関数 その4

7.6 文字列の変換器の実例からです。 文字列を 0 と 1 のリストに変換/逆変換する関数を定義してみる 文字コードを2進数で表現して LSB から順に並べたリストにする bin2int は foldr を使って書ける bin2int = foldr (\x y -> x + 2 * y) 0 int2bin は再帰…