2012-02-01から1ヶ月間の記事一覧
10.8 練習問題 再帰と関数addを用いて、自然数の乗算関数 mult :: Nat -> Nat -> Nat を定義せよ。 これは楽勝。(10.3で定義したNatはゼロも自然数だったことを思い出して) module TenEightOne where import TenThree mult :: Nat -> Nat -> Nat mult Zero…
10.6 クラスとインスタンスの宣言 前にも書いたけど、Haskellのクラスは型クラスで、型クラスのインスタンスは型。 最初はBool型がEqクラスを実装する例。自分でも手を動かしたかったので、Bool型とEqクラスを自分で定義してみる。演算子はちょっと悩んだけ…
10.5 仮想マシン 二つ目の長い例題として、整数と加算演算子からなる単純な数式の型と、この数式を評価して整数にする関数を考えよう。 data Expr = Val Int | Add Expr Expr value :: Expr -> Int value (Val n) = n value (Add x y) = value x + value y …
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 練習問題 エラーの際に単にビープ音を鳴らすのではなく、エラーの位置が分かるように電卓を変更せよ。パーサーは消費しなかった文字列を返すという性質を活用するとよい。 「エラーの位置がわかるように」というのが何を求めているのかよくわからないが…