2011-01-01から1年間の記事一覧

WinHugsはやめる

そういえばうちにはMac Miniがあったんだった。ずっとWindowsばかり起動していたから忘れていた。 てなわけでMacPortsをインストールした後Hugsをインストール。Windowsからはteraterm経由でアクセス。 おお、快適。エスケープシーケンスも動くし。

生きてます

IOモナドで計算機はいいんだけどさあ。Windowsではちょっとねえ。前回書いたように、エスケープシーケンスは動かないし、グラフィクスライブラリ(HGLとかSOEとか)は動かないし。やる気が…… VirtualBoxかなにかでUbuntuとか動かして、そこでHaskellをやるか………

第9章 対話プログラム #1

仕事が忙しくて書けてなかったけど、忘れたわけではない。 入出力の型 IO aの簡易説明、っていうかこのWorldを使った説明はごまかしだよなあ。 写経したコードを試しに実行する時に困るんだよねえ。 カリー化によって(最近、ScalaやGroovy界隈で話題だった…

本物のモナドで第8章

教科書の第9章をパラパラと読んだら、第9章はIOモナド。しかも第8章のパーサーを使用するようだ。 てことは、第8章のパーサーを本物のモナドで定義しておかないと、サンプルコードを実行できないと思われる。 仕方なく、教科書のサイトから第8章のパーサーを…

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

演習問題 問題7 累乗を定義。 term' :: Parser Int term' = pow >>- \p -> (symbol "*" >>- \d -> term' >>- \t -> return' (p * t)) +++ (symbol "/" >>- \d -> term' >>- \t -> return' (p `div` t)) +++ return' p pow :: Parser Int pow = factor >>- \f…

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

演習問題 問題6 おれおれbindとreturnで。 expr' :: Parser Int expr' = term' >>- \t -> (symbol "+" >>- \d -> expr' >>- \e -> return' (t + e)) +++ (symbol "-" >>- \d -> expr' >>- \e -> return' (t - e)) +++ return' t term' :: Parser Int term' =…

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

演習問題 問題4 expr | term ______|________ | | | factor * term | _____|___ nat | | | | factor * term 2 | | nat factor | | 3 nat | 4 expr | term ___________|_____ | | | factor * term _______|________ | | | | factor ( expr ) | ____|____ nat …

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

旅行に行ったので間があいてしまった。 数式 相変わらずdo記法を使わずにオレオレbindとオレオレreturnで書いてみる。 expr :: Parser Int expr = term >>- \t -> (symbol "+" >>- \d -> expr >>- \e -> return' (t + e)) +++ return' t term :: Parser Int …

第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>…

Haskell学習の目標

とりあえずの目標は、http://d.hatena.ne.jp/rst76/20100706/1278430517を全部理解できるようになること。 今日、UnitとBindはモナドに関係しているということを知った。 http://blogs.msdn.com/b/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx 教…

第3章 型とクラス #1

さて、そろそろHaskellらしいところに入ってきたかな。 型を示すには、式 :: 型 と書く。 なんだか、いきなり前振りなしで「評価されていない式」って言葉が出てきた。Haskellの遅延評価のことを言っているのかもしれないが、唐突すぎるだろ。この本のこうい…

第2章 はじめの一歩

処理系としては、Haskell Platform 2011.2.0.1 および WinHugs をインストールしてある。 最初、test.hsをロードしようとしてエラーが出て困った。 ERROR file:test.hs:1 - Syntax error in declaration (unexpected symbol "x") ちょっとぐぐったら原因判明…

プログラミングHaskellを買った

https://www.amazon.co.jp/dp/4274067815 これから勉強していく。 まずは第1章を読んだ。が、プログラムなんだか数学なんだか。いきなりリストが出てきているし。qsortの定義は擬似コードなのか実コードなのかわからない。 練習問題1なんだこれ。外側のdoubl…