Haskell

追記

main = do seed このようなコードを書いて 配列アクセス以外のオーバーヘッドを計ってみたところ、 $ ./a.out loop : 2.28299 sec. このようになった。 これを考えるとData.Arrayはかなり高速だということがわかる。 100万回で数十ms、1回当たり数十nsなので…

純粋関数型では配列はつらいのかどうなのか

純粋関数型言語では配列の扱いが若干厄介だ。 というのも、配列というものが本来mutableな使い方を想定するものだからだろう。 (定数オーダでテーブルを参照したいようなケースもあるが…) 参照透明を守る形で配列を実装する方法は大体以下の通り。 (計算量O(…

ICPC2004 in Haskell

ずっとやろうと思っていたのだが、 なんだかほかのことをやっていたらこんなに遅くなってしまった。 ゲームが一段落した?ので気晴らしに解いてみることにした。 問題Dぐらいまではさくさく解けたのだが、 問題Eは結構めんどくさかったし、 問題Fはなんかへん…

Haskellプログラマはゲームプログラミングに何を見たか?(実例編)

ええ……、2日ほど遅延評価の迷宮をさまよっていた。 Haskellは勉強すればするほどどんどん深みにはまっていくような気がする。 当初のもくろみは今回もそんなに外れてはいなかったが、 まだまだ工夫の余地がたくさんある。たくさん有りすぎて大変だ。 Haskell…

フリーソフトウェアライセンス診断

僭越ながら私も(wxHaskellで)書いてみたり… import Graphics.UI.WX import System.Exit main = startQuestion "フリーソフトウェアライセンス診断" q1 q1 = yn "あなたのコードを商用ソフトウェアに組み込まれて販売されてもかまわないか?" q2 (res "GPLラ…

Re: Re: wxHaskell (その3)

コンソール消すのはオプションがありましたか… どこかにあると思って探したのですが、結局見つけられず あのような記事になってしまってお恥ずかしい。 Charも一バイトじゃあなかったんですね。 これも適当なこと書いてしまって申し訳ないです。 (後で直して…

その2 描画システム編

今回は今までの胡散臭い話からちょっと離れて描画システムを考える。 前回の話で、入力リストに対して[IO()]でも返しとけやということになったのであるが、 IO()では自由すぎるので描画に関して一つ考えてみることにする。 なお、今回のキーワードはgraphics…

その1続き

昨日の続き。 継続を用いて並列的な処理の記述を行うということであった。 今回はその具体的方法について述べる。 この方法の基本的なアイデアはHaskellのPreludeにあるinteractである。 このページでもたびたび取り上げているので詳しくはそちらを見てもら…

超前衛的ゲームプログラミング方法論 その1

予定 1:コア編 2:描画システム編 3:(おまけ)サウンドシステム編 その0 概要 はじめに 今年の未踏ユースにて、目的じゃなくて手段が先に来てるとか、 習作ぽいとか、テーマに何か引っかかるものはあるけどPM的にはピンと来ないとか、 散々な理由で採択されな…

Parser Combinatorというもの(その2)

このページにはいわゆる解説記事を載せるつもりは無かったのだが、 (たいていは他にもっとうまい説明のページがあるだろうから…) どうやらこれがそうなってしまいそうである。 もっとまともな解説は http://sky.zero.ad.jp/~zaa54437/programming/clean/Clea…

Yaccと正規表現とParser Combinatorと

(序)突然であるが、Haskellは文字列処理が強力だと思う。 それも最強レベルに。 他のいわゆる文字列処理が得意であるとされる言語のように 正規表現による置換が可能であるとか、文字列がオブジェクトで 有用なメソッドがたくさん使えるとかそういった 小手…

続・遅延IO

少し前に遅延IOの話を書いたと思う。 そのときはgetContentsなどの遅延する関数は 実はモナドの法則(bind演算の結合法則)に従っておらず、 ちょっぴりunsafeで、でも入力を根こそぎ持っていくような ケースだと大して問題にならないどころか有用にもなりえる…

追記

行ごとに処理するだけならこんなのでも良かった。 import Data.List main = interact $ \d -> let (l,w,c) = calc d in show l ++ " " ++ show w ++ " " ++ show c where calc = foldl' sadd (0,0,0) . map wccc . lines wccc str = (length $ words str,len…

遅延評価の落とし穴

http://www.bagley.org/~doug/shootout/ このページ、言語の比較ページなのであるが、 Haskellのスコアが不当に低いように感じた。 全体のスコアは未実装のテストが有ると大幅に低下してしまうようなのだが、 LOC(コードの長さ)でもあまり芳しくないのはどう…

SDL AUDIO にしてやられる

HSDL(http://fxp.infoseek.ne.jp/haskell/HSDL/)だが、音楽関係、 昨日書いたメモリの問題で大き目のWAVを鳴らすことが不可能だったり まともにミックスするのが大変だったり、 フォーマット変換が出来なかったりいろいろ作りかけだったので その辺の実装を…

メモリ食い

リストはHaskellのデータの中でもっとも基本的なものだが、 とてもたくさんメモリを食うようである。 20MBのファイルをstrictに読み込んだら256MBのヒープ制限を越えてしまった。 それで、2MBのファイルを読み込んだらメモリ使用量が50MBと出た。 …1バイトあ…

Brainfuck

今更ながらにBrainfuckを実装してみた。 いつもどおりHaskellで… http://www.muppetlabs.com/~breadbox/bf/言語仕様的にどっちかと言うとコンパイラのほうが簡単である。 main = interact $ (header++).(++footer).(>>= cvt).(filter (`elem` ">cvt '>' = "+…

続・OpenGL

現在の安定リリース版GHC(6.2.1)にはOpenGLライブラリから テクスチャサポートがはずされているらしい。 http://www.haskell.org/pipermail/hopengl/2004-May/000489.html これは参った。 テクスチャが張れないと2DのゲームにOpenGL使えへんやん? メインブラ…

HaskellでOpenGL

昨日までOpenGLのおの字も知らなかったのだが、 気が向いたのでやってみることにした。 なんというか、思いのほか簡単である。 もっと初期化とかめんどくさいと思っていた。とりあえず、初期化のコード main = do True OpenGL" "" sur OPENGL] loop sdlQuit …

Haskell/SDL版テトリス

wsTetlisをSDL向けに移植した。 http://fxp.hp.infoseek.co.jp/haskell/HSDL/ サンプルに追加。 移植自体は非常に潤滑に進行したので 今回もデバッグ作業をしなくて済んだ。

遅延IO

Haskellを勉強したてのころ、interact String) -> IO () という型を持つ関数">*1という関数にひどくおどろかされたものである。 たとえば、 main = interact $ map toUpper などと書けば入力を大文字に変換して出力するプログラムとなる。 こう書くといたっ…

malloc new

Foreign.Marshal.Alloc.mallocとか、GCしてくれないのね… メモリだだ漏れ。

FFI (その6)

ついにこの連載(?)も6回目になった。 6回目ということは6日目ということで、 もうかれこれ一週間もFFI漬けだということなのだが。 昨日の終わりからどばーっとコード書いて、 どばーっとMakefileの勉強して、どばーっとHaddockで ドキュメント作ってwxHaskel…

FFI (その5)

Audio周りを実装。 今回も考えるところが多くて大変。 とりあえずミキサーをどうするかということなのだが、 やっぱりこれもHaskell側で書くことにした。 コールバックはもともとの仕様と同じ Ptr() -> Ptr Word8 -> Int -> IO () な関数で受け取り、Haskell…

FFI (その4)

こっちも作り始めて3日目、そろそろ形になりつつある。 今日はEvent周りを作ったのであと大きな課題はAudioぐらいか。 Audioもパフォーマンスを考えなかったらミックスルーチンを 適当にHaskellで書くだけなのだが… それにしてもEvent周りは大変だった。 何…

FFI (その3)

前回までで大体FFIの方法がわかったので、 とりあえずVideoのラッパを作成した。 本当にうすうすなラッパなんだけど… しかし、ポインタのやり取りが多いのでどうすればいいのか結構悩んだ。 結局Surface以外はStorableなデータとしてあらわすことにした。 Fo…

FFI (その2)

前回の続き。 今日はコードがひときわ多い。 CからHaskellは呼び出せたので、 今度はHaskellからCコードを呼び出してみようと思う。 …しっかし、マニュアルが全然読めない。英語なので… どうでもいいがForeignモジュールはHaskellの暗黒方面っぽい。 メモリ…

Foreign function interface (FFI)

昨日適当なテトリスが出来上がったけど、 まだまだHaskellネタが続くのです。 現時点であと二つほどは書きたいネタがあったりする。 Haskell上でのゲームプログラミングの方法論、 端的に言うとエレガントさの追求はまた今度。 とりあえず昨日までwxHaskell…

wxHaskell (その5)

前回のでゲームを作るための基盤はおおよそ固まっていたので、 とりあえず何か作ってみることにした。 何か、といってもあれなので、この前コメントをいただいたテトリスを作ることにした。 HaskellでGUIテトリス。半年ほど前、Haskellというものを知ったこ…

部分ビットマップ転送

上話題続き。 ビットマップの一部を描画したいと思ったのだが、 (小さいパーツをまとめてひとつのビットマップファイルにしたい) wxHaskellのビットマップ描画関数にはどうもそれらしき機能が見当たらない。 drawBitmap :: DC a -> Bitmap () -> Point -> Bo…