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

第8章 関数型パーサー #3

間を空けると感覚が鈍ってだめだなあ。 パーサーの部品 ひたすら写経。 import Data.Char sat :: (Char -> Bool) -> Parser Char sat p = item >>- \x -> if p x then return' x else failure digit :: Parser Char digit = sat isDigit lower :: Parser Cha…

第8章 関数型パーサー #2

連結 今度はバインド演算子 (>>=)が出てきた。 教科書では、この演算子は「そして」と読めばいいと書いてある。教科書の付録Bには、この演算子の意味は“順序付け”だとある。その真意は後から分かってくる。 (>>-) :: Parser a -> (a -> Parser b) -> Parser …

第8章 関数型パーサー #1

モナドの章!(教科書にはまだ「モナド」という言葉は出てこないのだけど) 本章のパーサーは、文字列を受け取って、パース結果と残りの文字列の組をリストとして返す。 Maybeの代わりにリストで成功・失敗を表現するところが興味深い。まあリストもモナドな…

第7章 高階関数 #3

ちょっと寄り道しすぎたかな。 関数合成演算子 (.) :: (b -> c) -> (a -> b) -> (a -> c) f . g = \x -> f (g x) この演算は結合法則を満たすという。 f . (g . h) = f . (\x -> g (h x)) = \y -> f ((\x -> g (h x)) y) = \y -> f (g (h y)) (f . g) . h = …

foldrでdrop

foldrが無限リストを扱えるというならできるはずだと思って書いてみた。 drop' n = foldr f [] . zip (trueWhile n) where trueWhile n = (replicate n True) ++ (repeat False) f (True, _) = id f (_ , x) = (:) x (追記)foldrに食わせる関数が2引数であ…

第7章 高階関数 #2

リスト処理 標準ライブラリPreludeに含まれるリスト処理高階関数。 map :: (a -> b) -> [a] -> [b] filter :: (a -> Bool) -> [a] -> [a] all :: (a -> Bool) -> [a] -> Bool any :: (a -> Bool) -> [a] -> Bool takeWhile :: (a -> Bool) -> [a] -> [a] dro…

第7章 高階関数 #1

map/filter/foldr/foldlを例にした説明。 このうち、foldr以外はLINQにもある。mapはSelect、filterはWhere、foldlはAggregate。だから大体問題ないんだけど、foldrを理解するのにちょっと時間がかかった。 教科書にはまだ書いてなかったんだけど、どうやらf…

第6章 再帰関数

考え方は難しくないけど、パターンマッチがおもしろい。 基本概念 繰り返し簡約することで値が求まる。n+kパターンは再帰に便利。 factorial 0 = 1 factorial (n + 1) = (n + 1) * factorial n リストに対する再帰 これこれ。このパターンマッチを忘れていた…

ここまでのまとめ:ライブラリ関数

ここまで教科書に出てきたライブラリ関数(演算子も含める)をまとめてみる。 教科書の付録Aにはもっと多くの関数が載っている。(付録Aを読んでみたら、ガードのotherwiseはキーワードではなくTrueと評価される定数だった。新しい発見。) (+) :: Num a => a …

第5章 リスト内包表記

C#だとLINQだけど、Haskellなどの関数型言語やPythonではリスト内包。これも書き方さえ覚えてしまえばそんなに難しい話じゃない。 Haskellではforとか書かないので、やっぱり数学っぽい。でもやってることはforと同じ。 [(x, y) | x <- [1, 2, 3], y <- [4, …

第4章 関数定義

条件式 if 論理式 then 式1 else 式2 の3つ組。ifもthenもelseも関数ではないようだが、3つ組で式となる。 abs' n = if n >= 0 then n else - n 話はそれるが、この場合の最後のやつは単項演算子に見えるけど、実は2項演算子なのかな。もしそうなら、(-n) = …

第3章 型とクラス #2

だんだんそれっぽくなってきた。 多相型 型の中に型変数を含めることで、任意の型に適用可能な関数を定義できる。これジェネリクスってことかなあ。 教科書に書いてあるlength関数の例は、 length :: [a] -> Int なんだけど、C#で言えば、 static int Length<T></t>…