2012-02-01から1ヶ月間の記事一覧

第10章 型とクラスの定義 #6

10.8 練習問題 再帰と関数addを用いて、自然数の乗算関数 mult :: Nat -> Nat -> Nat を定義せよ。 これは楽勝。(10.3で定義したNatはゼロも自然数だったことを思い出して) module TenEightOne where import TenThree mult :: Nat -> Nat -> Nat mult Zero…

第10章 型とクラスの定義 #5

10.6 クラスとインスタンスの宣言 前にも書いたけど、Haskellのクラスは型クラスで、型クラスのインスタンスは型。 最初はBool型がEqクラスを実装する例。自分でも手を動かしたかったので、Bool型とEqクラスを自分で定義してみる。演算子はちょっと悩んだけ…

第10章 型とクラスの定義 #4

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章 型とクラスの定義 #3

10.4 恒真式 命題論理式を表す型を作り、与えられた命題が恒真式(式に含まれる変数の値に関係なく、常に真となる式)かどうかを判定する関数を書く。 まずは命題の型を定義。 真理値(True, False)Const Bool 変数(A, B, ... , Z)Var Char 否定(¬)Not Prop …

第10章 型とクラスの定義 #2

前回の日記でdataによる型定義を学んだけど、これ、もっと掘り下げておくべきだったな。 引数なしのデータコンストラクタだと列挙型みたいなもの。これはOK。たとえば、Bool型の要素がTrueとFalse、といった形でこれまでも登場している。 でも引数ありのデー…

第10章 型とクラスの定義 #1

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

9.9 練習問題 練習問題5は「グラフィック・ライブラリを用いて」とか書いてあって面倒なのでパス。Windowsで動かなかったりするし。 ニムはボードを使うゲームである。ボードには、番号の付いた行が五つあり、はじめは星が以下のように並べてある。 1:***** …

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

9.9 練習問題 ライフゲームのボードを対話的に作成したり、変更したりできるエディターを作れ。 9.7で写経したライフゲームを修正して、ボードサイズを可変にできるようにしてやったぜ。 module NineNineFour where import System.IO import NineFive getCh …

Re: Haskell vs F#

http://d.hatena.ne.jp/rst76/20120204/1328362118 F#の環境を作るのが面倒という声も上がっているけど、 オンラインでやりゃいいじゃない。パンがなければお菓子を食べればいいじゃない。 というか、Linux/Mac/Solarisな人ならmonoを入れれ。 http://www.go…

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

9.9 練習問題 ライフゲームは、世代ごとに画面全体をクリアするので、動かす環境によっては、動きがちらつくかもしれない。それを防止するために、状態が変わったところだけ表示し直すようライフゲームを変更せよ。 うーん。リモートターミナルとかだとちら…

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

9.9 練習問題 エラーの際に単にビープ音を鳴らすのではなく、エラーの位置が分かるように電卓を変更せよ。パーサーは消費しなかった文字列を返すという性質を活用するとよい。 「エラーの位置がわかるように」というのが何を求めているのかよくわからないが…