Haskell の putStr は文字を出力しない。

Haskell には文字列を表示するための関数 putStr があります。 Main> :t putStr putStr :: String -> IO () putStr は文字列を引数として IO アクションを返します。 putStr は出力する手続きを返すのであって、putStr が呼ばれたときに関数の中で出力するの…

Data.Array で数独のテーブルを表現してみる

配列の練習にData.Array で数独のテーブルを表現してみます。 import Data.Array data Cell = Cell{digit::Int, mark::Char} deriving(Eq,Show) blockSize :: ((Int, Int), (Int, Int)) blockSize = ((1,1),(3,3)) type Block = Array (Int, Int) Cell -- 3 …

Haskellによる西暦(Day)和暦変換、和暦の比較

Data.Time.Calendar の Day型と返還可能な和暦の型、Warekiを定義しました。 Wareki は Ord インスタンスを実装してありますので、そのまま比較、ソートできます。 import Data.Time.Calendar (Day(..), fromGregorian, toGregorian, fromGregorianValid) im…

Data.Text 最初の一歩

import Data.Text import qualified Data.Text.IO as TI import Cinnamon.Ucs (ucs4ToSjis) -- pack :: String -> Text txt = pack "日本語" kana = pack "にほんご" main = do putStrLn $ ucs4ToSjis "日本語" -- > 日本語 putStrLn $ ucs4ToSjis $ unpack …

wxHaskell での「応答なし」を回避する。(Haskell によるメッセージ処理)

Haskell によるメッセージ処理 以前の「wxHaskell での「応答なし」を回避する」はメッセージ処理をCでやっていましたが、Esa Ilari Vuokko氏製のDirectXバインディングを使ってみるを参考にHaskellでメッセージ処理をします。 -- ghc --make Main.hs -o msg…

クリップボード内のWindows Path文字列をUNIX Path文字列に変更する(Haskell)。

mintty の中でエクスプローラに表示されたパスをコピーして、そのパスに移動したいときがあります。 しかし、コピーして貼付けると表示されるのは "C:\HaskellPlatform\Clipboard-2.2.0\dist"のような文字列で、そのままでは CD コマンドなどには使えません…

Haskell で変数を使う。(IORef、Stateモナド、STモナド)

先に作った電卓のレジスタのように Haskell でも状態を保持しておきたいときがあります。 先の電卓ではIORefを使ってレジスタの状態を保持しました。 IORef > :m + Data.IORef > do{ x <- newIORef 1; modifyIORef x (+2); ret <-readIORef x; return ret} -…

wxFormBuilder を使う(3)「Window の中央にパーツを配置」

FlexGridSizerを使えばWindowを最大にしても、デフォルトに戻してもパーツを中央に表示させることが出来ます。 オブジェクトツリー 最初にFrameを配置して次にBoxSizerを配置。この BoxSizer の orient を wxVERTICALにしてパーツを追加していくとFrameと同…

wxFormBuilder を使う(2)「woBoxSizer でパーツを配置」

python入門から応用までの学習サイト python-izm.com の BoxSizer を参考にボタンを配置してみます。BoxSizer はボタンやテキストなどの部品を縦方向もしくは横方向へ連続して配置するためのものです。縦に連続して配置するか、横に連続して配置するかは右の…

Haskell で wxFormBuilder を使う。

wxFormBuilderの使い方を学ぶには wxRubyのこと (RubyでGUI)はwxRubyのサイトです。wxFormBuilderを使用して、「Hello World」「ラーメンタイマー」「時計」「双六ゲーム」「Twitterクライアント」を作り、XRCファイルも公開していますので、wxFormBuilderの…

Frame にアイコンを表示する。

Frame にアイコンを表示するのには Graphics.UI.WXCore.Image の topLevelWindowSetIconFromFile を使います。 module Main where {- Graphics.UI.WX ライブラリはWXCoreよりは高級というかレイヤが上位。-} import Graphics.UI.WX (start) import Graphics.…

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…