2012-01-01から1年間の記事一覧
10.4 恒真式 命題論理式を表す型を作り、与えられた命題が恒真式(式に含まれる変数の値に関係なく、常に真となる式)かどうかを判定する関数を書く。 まずは命題の型を定義。 真理値(True, False)Const Bool 変数(A, B, ... , Z)Var Char 否定(¬)Not Prop …
前回の日記でdataによる型定義を学んだけど、これ、もっと掘り下げておくべきだったな。 引数なしのデータコンストラクタだと列挙型みたいなもの。これはOK。たとえば、Bool型の要素がTrueとFalse、といった形でこれまでも登場している。 でも引数ありのデー…
10.1 typeによる型宣言 typeキーワードは型のエイリアスに名前をつける方法。再帰定義はできない。 type Assoc k v = [(k,v)] find :: Eq k => k -> Assoc k v -> v find k t = head [v | (k',v) <- t, k == k'] newtypeキーワードは教科書に出て来てないな…
9.9 練習問題 練習問題5は「グラフィック・ライブラリを用いて」とか書いてあって面倒なのでパス。Windowsで動かなかったりするし。 ニムはボードを使うゲームである。ボードには、番号の付いた行が五つあり、はじめは星が以下のように並べてある。 1:***** …
9.9 練習問題 ライフゲームのボードを対話的に作成したり、変更したりできるエディターを作れ。 9.7で写経したライフゲームを修正して、ボードサイズを可変にできるようにしてやったぜ。 module NineNineFour where import System.IO import NineFive getCh …
http://d.hatena.ne.jp/rst76/20120204/1328362118 F#の環境を作るのが面倒という声も上がっているけど、 オンラインでやりゃいいじゃない。パンがなければお菓子を食べればいいじゃない。 というか、Linux/Mac/Solarisな人ならmonoを入れれ。 http://www.go…
9.9 練習問題 ライフゲームは、世代ごとに画面全体をクリアするので、動かす環境によっては、動きがちらつくかもしれない。それを防止するために、状態が変わったところだけ表示し直すようライフゲームを変更せよ。 うーん。リモートターミナルとかだとちら…
9.9 練習問題 エラーの際に単にビープ音を鳴らすのではなく、エラーの位置が分かるように電卓を変更せよ。パーサーは消費しなかった文字列を返すという性質を活用するとよい。 「エラーの位置がわかるように」というのが何を求めているのかよくわからないが…
では実際に解いてみよう。 9.9 練習問題 アクション getLine に、削除キーで文字を消去できる機能を加えたアクション readLine :: IO String を定義せよ。ヒント:一文字削除するための制御文字は "\DEL"、一文字戻るための制御文字列は "\ESC[1D" である。 …
さて、getChの前から怪しいと思ってたのだけど、getCharがEnterを押すまでキーを認識しない。 いろいろ調べると、バッファリングモードの問題らしく import IO do hSetBuffering stdio NoBuffering とかなんとかそういうのをやれと書いてある。が、やっても…
9.9 練習問題 今日は時間がないので、問題文を写すだけにしておく。 アクション getLine に、削除キーで文字を消去できる機能を加えたアクション readLine :: IO String を定義せよ。ヒント:一文字削除するための制御文字は "\DEL"、一文字戻るための制御文…
もともと、俺のHaskell学習の目標は、“http://d.hatena.ne.jp/rst76/20100706/1278430517を全部理解できるようになること”だったわけで、それは今でも変わっていない。 で、Haskellはだんだんわかって来たけど、“木探索から CPS にすることで効率化”が腑に落…
ライフゲーム さて、9.7はライフゲームの実装。 ひたすら写経。9.5で実装した関数群を使っている。 module NineSeven where import NineFive width :: Int width = 5 height :: Int height = 5 type Board = [Pos] glider :: Board glider = [(4,2), (2,3), …
9.6の計算機プログラムの中でgetChという関数が出てきていて、コンパイルに通らないのでgetCharに置き換えてたんだけど、 Hugs, but can be defined in Haskell as follows: >|haskell| import System.IO getCh :: IO Char getCh = do hSetEcho stdin False …
というわけでminttyからhugsを起動する方法にしたら捗った。 あと、今までは全部1ファイルでやろうとしていたが、色々無理が出てきたのでモジュール化した。 module NineSix where import Parsing import Expr import NineFive box :: [String] box = ["+---…
MSYS上のminttyからhugsを起動すればいいということで、今後はそうする。
Haskellにくわしい後輩から「F#教えてください」と言われたが、俺もわからんのよ。F#のコードを書いたことがないので。 でもそれじゃつまらないので、Haskellの勉強で学んだ知識をもとにF#に挑戦してみた。 いろいろ試行錯誤した結果がこれだ。One, Two Thre…