Haskell

課題2 データ構造をBNFに合わせる

2006-11-29 - メモ日記の記事の課題2。データ構造にダミーのデータコンストラクタが入ったのは、tParseというクラスメソッドをすべてのデータ型に対して実装しようとしたのが原因。これをしようとしたことで、tParseの引数と返り値が(a,[String])という型で…

課題

亀プログラム処理系の発展を考える。 課題は、 パースエラー時、エラーメッセージ出力 BNFデータ構造のダミーコンストラクタを消す Expandで新しい木構造を作るのはメモリのムダ遣いなのでやめる

はじめてのモナド

まず課題1。亀プログラム処理系プログラムがエラーメッセージを返せないのは、すべてのエラーがMaybeモナドのNothingになってしまい、それ以外の情報を抽出できないため。一方で、Maybeモナドを亀プログラム処理系プログラムで使用するのは自然。なぜならモ…

書いてみたプログラム

亀プログラム。 もともとは、「増補改訂版Java言語で学ぶデザインパターン入門」のInterpreterパターンの章で出てくる簡易言語(亀プログラム)の解釈をHaskellで書いたらどう書くのかという試み。BNF参考 <program> ::= program <command list> <command list> ::= <command>*end <command> ::= <repeat command> | <primitive command> <repeat command> ::= repeat <number> <command list> </command></number></repeat></primitive></repeat></command></command></command></command></program>

型、型クラスとMaybe

亀プログラムに向けて型と型クラスの練習。go/left/rightだけ考えてみる。型クラスはJavaでいうトコロのインタフェースに相当する。型クラスの関数を実装してインスタンス化。ムリヤリMaybeも入れてみるが、そのせいなのかなんなのかいまいちピンと来ず。ダ…

再帰的プロセスと反復的プロセス

再帰的手続きには、再帰的プロセスと反復的プロセスのふたつの種類がある(そうだ)。 階乗計算の例で言うと、 再帰的プロセス -- 階乗(再帰) myfact_r n = if n == 1 then 1 else n * myfact_r (n-1)これは遅延演算を行っている。再帰の最後になってみないと…

フィボナッチ数計算(続 再帰的・反復的)

再帰的プロセスは、計算の木構造をめいっぱい展開することになる。 だから再帰的プロセスより反復的プロセスのほうが低コスト。 以下、反復的プロセスが、再帰的プロセスよりも低コストになる典型例 再帰版フィボナッチ数計算 -- フィボナッチ数(高コスト) m…

listとwhere letとwhere

listとwhere letとwhereの使い分けがいまだによくわからない。

買いました

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門作者: 青木峰郎,山下伸夫出版社/メーカー: ソフトバンククリエイティブ発売日: 2006/06/01メディア: 単行本購入: 25人 クリック: 314回この商品を含むブログ (320件) を見る熟読する…

ニュートン法による平方根・立方根

平方根 -- 平均値 myaverage x y = (x + y) / 2 -- 平方根 mysqrt x = let { good_enough guess y = ( abs((guess*guess - y) / y) < 1e-10 ) ; val_improve guess y = myaverage guess (y/guess) ; sqrt_iter guess y = if (good_enough guess y) then gues…

Mapってなに。

リストのすべての要素に処理を行う。ただそれだけ。 Main> map myreverse [[1,2,3,5], [3,5,2,5], [2,4,6,8]] [[5,3,2,1],[5,2,5,3],[8,6,4,2]] Main> map (mymsort (<)) [[4,2,1,5], [3,5,2,5], [6,4,2,8]] [[1,2,4,5],[2,3,5,5],[2,4,6,8]]

listで練習 その2

Haskellの標準ライブラリのリファレンスを探してます。 リバース2 (++)を使わないリバースは降参。思いつきません。 挿入ソート -- insert sort myisort _ [] = [] myisort f (x:xs) = [y|y<-sorted, (not (f x y))] ++ (x:[y|y<-sorted, (f x y)]) where so…

listで練習

リバース (myreverse xs ++ x)じゃダメ。myreverse.hs myreverse [] = [] myreverse (x:xs) = myreverse xs ++ [x] マージソート mymsort.hs mymerge (f) [] x = x mymerge (f) x [] = x mymerge (f) x y = if (f) (head x) (head y) then [head x] ++ (myme…