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

wxFormBuilder を使って電卓を作ってみました。

自宅PCに wxHaskell をインストールする際に wxWidgets をコンパイルした wxPack というのがあることを知り、 wxPackを使って wxHaskell をインストールしました。 wxPackをインストールするとwxFormBuilder もインストールされました。 wxFormBuilder は wx…

春分日、秋分日

春分日、秋分日を計算する方法が紹介されていましたので計算してみました。 {- -- 春分日、秋分日 http://www.is.akita-u.ac.jp/~sig/holidays.html 1851 - 1899 [19.2811 + 0.242194 * (y - 1980) - [(y - 1983) / 4]] 1900 - 1979 [20.8357 + 0.242194 * (…

Haskell で2分探索木

プログラミングの基礎 第17章 「再帰的なデータ構造」の二分探索木をHaskell でやってみました。 import Test.HUnit data Tree_d = Empty | Leaf Int | Node (Tree_d, Int, Tree_d) deriving (Eq,Show) insertTree :: Tree_d -> Int -> Tree_d -- 空の木だっ…

Haskell の遅延評価のメリット

遅延評価はそのデータが必要になるまで演算されません。 今までは具体的にはそのメリットを感じたことはなかったのですが、これは便利と思うことがあったので書いておきます。 > :m + Debug.Trace -- 関数 func は2つの引数の和と積のタプルを返す関数です…

HUnit によるテストをしてみました。

本物のプログラマはHaskellを使う/ 第16回 Haskellでのテストの自動化を考えるを参考にHUnit によるテストをしてみました。 HUnitのインストール $ cabal install HUnit 与えられた身長(m),体重(kg) からBMI 指数を計算し、判定文字列を返します。シンガポー…

unfold 関数

「プログラミング Haskell 第7章 高階関数」の練習問題に unfold 関数が登場しています。 unfoldr は Data.List にも登録されていますので、どのような関数なのかやってみました。 foldはリストから値を求めますが、問題で作られている unfold 関数は初期値…

たらい回し関数によるGCC、OCaml、Haskellの速度比較

「お気楽 OCaml プログラミング入門」に色んな言語のたらいまわし関数の結果が掲載されていて、OCamlがCよりも速い驚異的な数値を叩き出していました。 Haskell がありませんでしたので比較してみました。 C #include <stdio.h> int tak(int x, int y, int z){ if (x </stdio.h>…

Parsec を使った計算機

Parsec を使った計算機。 import Text.ParserCombinators.Parsec import Control.Applicative hiding ((<|>)) expr :: Parser Int expr = tok(term) >>= (\t -> ((symbol "+") >> expr >>= (\e -> return (t + e ))) <|> ((symbol "-") >> expr >>= (\m -> r…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(16) : 基本 IO の作成(2)

Write Yourself a Scheme in 48 Hours/Creating IO Primitives http://jonathan.tang.name/files/scheme_in_48/code/listing10.hs ioPrimitives が追加になって、"apply"など組み込み関数が使えるようになったかと思って実行してみるとエラーになります。 io…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(15) : 基本 IO の作成。

Write Yourself a Scheme in 48 Hours/Creating IO Primitives http://jonathan.tang.name/files/scheme_in_48/code/listing10.hs Haskellはこれが最後のファイルです。 -- forall でエラーにならないように先頭に記入しておきます。 {-# LANGUAGE Existenti…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(14) : Scheme関数の定義(3)

48時間でSchemeを書こう/Scheme関数の定義 http://jonathan.tang.name/files/scheme_in_48/code/listing9.hs apply の部分をもう少し追います。 apply は引数 args に引数 Func を適用して、その結果を返すという関数で、そのパターンは二つあります。 (1)最…

数字混じり文字列ソート

練習に「数字混じり文字列ソート」をしてみました。 例1: 辞書順ソート: 1.txt, 10.txt, 100.txt, 2.txt, 20.txt 数字混じり文字列ソート: 1.txt, 2.txt, 10.txt, 20.txt, 100.txt 例2: 辞書順ソート: x12, x13, x1A, x1B, xAB 数字混じり文字列ソート: x1A,…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(14) : Scheme関数の定義(2)

48時間でSchemeを書こう/Scheme関数の定義 http://jonathan.tang.name/files/scheme_in_48/code/listing9.hs trace を入れて define、その定義された関数の適用される様子を追ってみます。 表示するための定義 instance Show LispVal where show = showVal2 …

「Write Yourself a Scheme in 48 Hours」 を写経してみる(13) : Scheme関数の定義

48時間でSchemeを書こう/Scheme関数の定義 http://jonathan.tang.name/files/scheme_in_48/code/listing9.hs まず、 LispVal型のデータを見ますと二つの型が追加されています。 data LispVal = Atom String | List [LispVal] | DottedList [LispVal] LispVal…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(12) : 「エラーチェックと例外」をもっと

Env の内容が表示出来るようになったところで、 defineVarを動かしてみたいのですが Show インスタンスがないので表示できません。 > env <- nullEnv > showEnv env -- > [] > defineVar env "y" (Number 9) <interactive>:1:0: No instance for (Show (IOThrowsError Lis</interactive>…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(11) : Env の内容がみたい

「Write Yourself a Scheme in 48 Hours」 を写経してみる(9) : 変数の追加と割り当ての中で define, set!で変数が定義、変更される様子を覗きたかったのですが、IORef が入れ子になっていて簡単には覗けません。そこで、IORefの練習に表示する関数を作って…

Error Monad (Exception Monad)

モナドのすべて Haskell におけるモナドプログラミングの理論と実践に関する包括的ガイドの Error モナドを写経してみました。 import Monad import System import Control.Monad.Error import Char import Debug.Trace -- 表示できるように deriving Showを…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(10) : cdr の評価が間違っている。

「Write Yourself a Scheme in 48 Hours」 を写経してみる(6) : 評価その2の中で cdr を評価する部分があったのですけれども、kazu-yamamoto さんの「HaskellでScheme」という記事の中で「cdr の定義が間違っている」記述を見つけました。 cdr [DottedList …

「Write Yourself a Scheme in 48 Hours」 を写経してみる(9) : 変数の追加と割り当て

Write Yourself a Scheme in 48 Hours/Adding Variables and Assignment http://jonathan.tang.name/files/scheme_in_48/code/listing8.hs まず、評価をするeval関数から見ていきます。 eval :: Env -> LispVal -> IOThrowsError LispVal eval env val@(Stri…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(8) : REPLを構築する。

Write Yourself a Scheme in 48 Hours/Building a REPL http://jonathan.tang.name/files/scheme_in_48/code/listing7.hs REPLとは Read-eval-print loopの略。読み込んで評価をしてそれを表示・・・その繰り返しをする対話型評価環境を作ります。 import IO…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(7) : Equal? と弱いタイピング: 不均一なリスト

タイトルが長すぎるのが気になります・・・。 Write Yourself a Scheme in 48 Hours/Evaluation, Part 2 http://jonathan.tang.name/files/scheme_in_48/code/listing6.4.hs まず、ghci listing6.4.hs とするとエラーになります。 $ ghci listing6.4.hs GHCi…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(6) : 評価その2

Write Yourself a Scheme in 48 Hours/Evaluation, Part 2 http://jonathan.tang.name/files/scheme_in_48/code/listing6.3.hs primitives :: [(String, [LispVal] -> ThrowsError LispVal)] primitives = [("+", numericBinop (+)), ("-", numericBinop (-)…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(5) : エラーチェックと例外

Write Yourself a Scheme in 48 Hours/Error Checking and Exceptions http://jonathan.tang.name/files/scheme_in_48/code/listing5.hs -- readExpr は (Right) パースに成功するとパースした値を返す。 -- 失敗のときは (Parser err) の例外を投げる。 rea…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(3)

http://jonathan.tang.name/files/scheme_in_48/code/listing4.3.hs 今回は基本的なS式の評価です。 評価する様子が見えるようにtraceを入れてみました。 内部データが見えるように Show インスタンスをコメントで無効にし、deriving Show を追加しました。 …

「Write Yourself a Scheme in 48 Hours」 を写経してみる(4) : ($) を使って関数を引数とする関数を作る。

Write Yourself a Scheme in 48 Hours/Evaluation, Part 1の中に次に示す apply 関数が定義してあります。 apply 関数は (+ 1 2 3) のような関数のときに func:"+"、 args:[Number 1,Number 2,Number 3] として、argsにfuncを適用させるための関数です。 loo…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(2)

HaskellでLispを書く日記を読んでいたのですけれども、私の能力では Cons のネストを追うのが大変なので、以前に写経した「『Write Yourself a Scheme in 48 Hours』を写経してみる」の続きをやってみます(こっちは出来ない英語なので大変なのですが)。 まず…

「HaskellでLispを書く日記」を読む(2)

「HaskellでLispを書く日記 / evalの作成(変数編) Lisp は定義された値をテーブルに登録し、それを検索しているようです。 import Text.ParserCombinators.Parsec data Sexp = Nil | Symbol String | N Integer | Cons Sexp Sexp deriving Show {- リスト…

「HaskellでLispを書く日記」を読む(1)

「HaskellでLispを書く日記」を写経しながら読んでみます。 import Text.ParserCombinators.Parsec import Debug.Trace data Sexp = Nil | Symbol String |Cons Sexp Sexp deriving Show Show、Read クラスのインスタンスも定義してありますがSexp型データの…

Parsecにちょっと触ってみる(9): S式っぽい計算機

Parsec, 高速なコンビネータパーサ 練習にS式っぽい計算機を作ってみました。 import Text.ParserCombinators.Parsec import Data.List -- sexpは'('と')'に囲まれていて、"*/+-"のどれかの次にスペースがあって、 -- スペースで区切られたexprがある。 sexp…

モナドって何だろう(2) List モナド

List モナドは長さの変化するリストの演算を連鎖させて行うときに使います。 例としてフィボナッチ数を求めてみます。 フィボナッチ数 1つがいの兎は、産まれて2か月後から毎月1つがいずつの兎を産む。 1つがいの兎は1年の間に何つがいの兎になるか?つがい…