椿の日記

たぶんプログラムの話をします

Haskell

MySQLの日本語表示の話

なんか日本語が表示できないなあ、と思ってたら凄く単純な話でした。これをやっておかないとならないようです。 quickQuery conn "SET NAMES utf8" [] こうしないと、日本語文字の部分が?に化けてしまいます。これはmysqlの関数がやっているようで、Haskell…

Haskellの実行速度

haskell vs その他の言語 - ながとの日記 という記事を見て、へぇーと思ってみてたのですが、元記事のコードの次の2つが何故これほどまでに違うのか、ちょっと気になったのでコンパイルだけして実際に確認してみます。(2つ目のはBangPatternの言語拡張のとこ…

Haskellでこの問題を解いてみた②

同じ人が別の問題を作っておられたようなので、解いてみました。ぷよぷよ19連鎖 import Data.Array import Data.List type Point = (Int,Int) type Field = Array Point Char type Route = [Point] isLegalPuyo :: Char -> Bool isLegalPuyo '\n' = False is…

Haskellでこの問題を解いてみた

web巡回してたらこんなページを見つけたので、解いてみました。人材獲得作戦・4 試験問題ほか import Data.Array import Data.Maybe import Data.List data Cell = Space | Wall | Start | Goal | Road deriving (Show, Eq) type Field = Array (Int,Int) C…

Haskellからmysqlを実行する

Haskellからmysqlを叩きたくなったので調べていたのですが、かなり骨が折れる作業になりました。一筋縄に行かない問題が次から次へと…。しかしなんとか解決できたので、忘れないように覚書を残しておきます。 ビルドするのはThe HDBC-mysql packageです。パ…

boost::variantでデータ構造を書き換え

boost::variantを利用してシェイプクラスを抽象的にします。 typedef boost::variant<Sphere,Plane> Shape; enum SHAPE_TYPE { SHAPE_TYPE_SPHERE, SHAPE_TYPE_PLANE, }; struct Scene { std::vector<Shape> shapes; std::vector<Vector3> directionalLights; }; 関数型言語に慣れ始めると</vector3></shape></sphere,plane>…

スレッドを使ってみる(2)

直接となる原因は分かりませんが、Win32のsleepではなく、Control.Concurrent.threadDelayを使うと、上手くいくようです。 [0,0,0,32769,32768] [32768,32768,32768,32768,32768] [32768,0,0,0,0] [0,0,0,0,0] [0,32769,32768,32768,32768] [0,0,0,0,0]期待…

スレッドを使ってみる

ゲームプログラムでは、メインスレッドからコントローラ入力監視のスレッドを独立させ、短い周期でポーリングし、得られたデータをキューに突っ込んでメインスレッドから扱えるようにすると良いと思います。 とりあえずHaskellでやってみるんで、まずシング…

Text.Regex.Posixがリンクできない

GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking .…

Haskellの構造体をCと同期させる

Haskellの代数的データ型とCの構造体を通信するためにhsc2hsというツールを使うと便利らしい。次のHogeという構造体でテストしてみた。 サンプルコード // Types.h struct Hoge { uint32_t field; }; -- Types.hsc {-# LANGUAGE ForeignFunctionInterface #-…

HaskellでDirect3D11を使う

最初に断っておくとインチキです。(笑) 純粋にHaskellでCOMインタフェイスを叩いてるわけではないので期待された方すいません。 ポイントはこれだけです。 Direct3D11インタフェイスはC++で叩いてDLL化する Haskellは自分で作ったDLLを呼び出す C++側の実装 …

ポインタで値を受け取る関数のFFI

C言語は、言語の都合上、関数へ渡したアドレスを用いて戻り値を受け取ることがしばしばあります。 extern "C" void ReceivePointer( int* p ) { *p = 100; }これをHaskellで受け取るために、次のような手順をとります。 allocaでスタック上にメモリを割り当…

DLLをHaskellで使う

以前Haskellでiconvでもiconv.dllを使いましたが、今度は自分でDLLを作ってFFIを利用して呼び出してみます。 DLLを作る 自分は、普段はVisualStudioを使ってるので、VS2010でDLLを構築します。 とりあえずWin32プロジェクトでDLLを選択して、以下のような関…

HaskellでWin32メッセージループをPeekMessageで制御してみる

こんどはEsa Ilari Vuokko氏製のDirectXバインディングを使ってみるを見ながらコピペしつつ修正していきます。 とりあえず、PeekMessageを使った後にMSG構造体の中身を見ることになるので、まずはMSG構造体のHaskell版を定義します。 data MSG = MSG { msg_h…

HaskellでWin32プログラミング

少し思い立って、HaskellでWin32プログラミングをするにはどうするんだろう、と思ってやってみました。 こちらのサイトが非常に参考になりましたので参考…というよりほとんどコピペ。 http://d.hatena.ne.jp/Otter_O/20080523/1211527903 {-# LANGUAGE Forei…

類っていうか種っていうんですね

Kindについて調べていましたが、言語仕様に詳しく書いてありました。http://www.sampou.org/haskell/report-revised-j/decls.html 記号 * はすべての引数なしの型構成子を表す。 もし、k1 および k2 が種ならば、 k1-> k2 は種 k1 のある型を引数としてとり…

類(Kind)

「ふつうのHaskellプログラミング」の269ページに次のように書かれていました。 ちなみに、このように型変数が正しく使われているかどうかチェックするときには類(Kind)という概念が使われています。 類は型の型のようなものです(型クラスともまた違います)…

あれ?

そういや、StringをパースするときはParsecライブラリが勝手に位置情報を仕込むくせに、[Tok]のパース時には自動的には位置情報が仕込まれませんでしたね。というかコンパイルエラーになるので、[Token]の形で出力しないとならなかったのですが…。Tokではテ…

Parsec覚書

Parsecを使えば簡単にパーサかけるし余裕余裕、 と思ってたら結局手間取ってしまったので、ポイントだけ抑えておきます。 サボらずにLexerからのParserという流れで作る Lexerの出力であるトークンには位置情報を仕込んで生成する 位置情報は字句解析の後の…

wxHaskellでカスタムコントロールを作ってみた

作り方が分かると凄く簡単でした。IOだの状態だの使いまくったためHaskellっぽくない気もするのですが、そこらへんの部分をカスタムコントロールで吸収しきれば幸せな人生が待ってる、と信じることにしたので作るのは苦行にはなりませんでした。作ったのはヘ…

wxHaskellのカスタムコントロールの作り方

Viewのコードを再利用したくなって、こりゃカスタムコントロールを作らなきゃならんなぁ…と思ったものの、wxHaskellでのカスタムコントロールの作り方がわからんちん。特に、カスタム属性の保存とか取得って一体どうやってやるの? と思ってたのですがこんな…

Hackageのドキュメントが新しくなってた

前のほうが見やすかったような。

wxHaskellのListCtrl

デフォルトの状態でListCtrlを構築してクリックするとWindowsのサウンドで設定されているエラー音が何故か鳴ったり、 カーソルをアイテムの上に載せて右クリックを続けるとon clickRightイベントとon listEvent+ListItemRightClickイベントが交互に呼ばれた…

wxHaskellでマウスの位置取得

こんな初歩的なことでもドキュメントを漁らないとならん(笑)美しく書けるのは嬉しいんだけど、大半の関数が知らない関数なので、何をするにもまずドキュメント、という感じになってしまいます。wxHaskellでマウスの位置を取得するには大雑把に2通りの方法が…

haskellの変数に付けるコーディング規約とか

実際にHaskellでアプリを書いていて気になりはじめたんだけど、色んなものの命名規則を決めておかないとコード書くたびに悩んでしまって駄目ですね。Haskellはxだのxsだの短い変数をつけるのが慣習みたいですが自分はそういう命名が嫌いなので長い名前を付け…

wxHaskellのイベントハンドラと、アプリケーションの状態の記憶

wxHaskellでは、ウィンドウでのイベントをIOモナドの関数で処理するための仕組みがあります。 例えば「ファイル→終了」のメニューアイテムに「close f」というウィンドウfを閉じる処理を割り当てるなら次のようなIOモナドによってイベントハンドラを設定しま…

wxHaskellがIOモナドだらけ

ドキュメントを見れば見るほど、やたらとIOモナドが目に付いてしまう。関数型言語でGUIを使えるようにした結果がこれでは、がっかりにもほどがあります…。IOモナド汚染から逃れるために、外側でIOの"殻"を外してしまえばいいのだろうけど、そもそも、楽にプ…

ビットマップの部分描画

wxHaskellでBitmapを部分描画しようとおもったんだけど、関数が見つからない。Data.BitmapにcopySubImageという関数がある。これを使ったらいけるだろうか、と思ったら、Data.BitmapとwxHaskellのBitmapは型的に別物だったり。検索してみたら同様のことで悩…

wxHaskellを再インストールするときは

wxWidgetsの設定を少し変えてwxHaskellを再インストールするときは、次のようにwxcoreを忘れず更新します。 $ cabal install wxcore --reinstall $ cabal install wx --reinstall おそらく、wxcoreがC側とのやり取りをしてるので、こっちだけでいいのかもし…

wxHaskellインストール手順

こちらを参考にして進めます。 http://d.hatena.ne.jp/sirocco/20100620/1276999507 wxWidgetsのインストール ここからwxWidgetsの最新(現時点で2.8.11)をダウンロードして、適当なところで展開します。 http://www.wxwidgets.org/downloads/ MSYS環境で、展…