Haskell

wxHaskell :: Notebook で tab を選択したときのイベントを取得する

radio box や list box 、choice は on selectによって選択したときのイベントを取得できますが、NotebookにはSelectingインスタンスがありません。そこで on click イベントによりどこのタブがクリックされたか判定します。 on click イベントはマウスがク…

正常にパース出来た場合はJust、失敗した場合はNothingを返すmaybeRead

read関数は文字列から指定された型のデータを生成します。 型が指定されない場合、read関数はどんな型に変換すれば良いか分からないので例外を発生します。 また、パースにエラーがある場合にも、例外を発生します。 > read "123"::Int -- > 123 -- 型が指定…

GHC の ScopedTypeVariables オプション

Rosetta Code にあるDetect division by zeroをコンパイルしてみたのですが、GHC 7.6.3ではエラーになってしまいます。出力されたエラーメッセージで検索すると arising from a use of `Control.Exception.catch' がみつかりました。 {-# LANGUAGE ScopedTyp…

GHCi runtime linker: fatal error: I found a duplicate definition for symbol

Windows 8.1にGHCの環境を構築しているのですが、 GHCi runtime linker: fatal error: I found a duplicate definition for symbol というエラーが出るようになってしまいました。エラー・メッセージで検索したサイトのひとつに次のサイトがありました。GHCi…

HaskellからCの配列を利用する

ITプロに「本物のプログラマはHaskellを使う」が連載されていますが、今回の記事はは「第58回 Cの配列をHaskellで利用する」です。丁度配列を使いたいところでした。しかし、Array 型は、参照は O(1) で出来ますが、 更新には O(n) かかります。 そこで、記…

with を使って C の関数へポインタ渡しをする

Foreign.Marshal.UtilsのwithはC の関数への引数をポインタ渡しするときに使う。 -- ghc --make -Wall frexp.hs test.c -o frex {-# LANGUAGE ForeignFunctionInterface #-} import Foreign.Ptr import Foreign.C.Types import Foreign.Marshal.Utils foreig…

hashtables: Mutable hash tables in the ST monad を使う。

Data.HashTableを使おうとすると hashtables パッケージを使えというメッセージがありましたのでインストールしてみました。 Announcing: "hashtables", a new Haskell library for fast mutable hash tables hashtables とhashableをインストール。 hashtab…

Haskellによる西暦(Day)⇔和暦変換、和暦の比較(定義ファイル読み込みバージョン)

定義ファイルで元号名、元号が使用開始された西暦年月日、最終西暦年月日を定義ファイルから読み込みます。 代数的データ型のアクセサを使うと可読性が悪くなるので、パターンマッチにより取り出す方法を使うようになりました。 module Main where import Da…

wxHaskellのGridでデータをチェックボックス、数字、Choiceにより編集、表示する。

wxHaskell で HaskellをVBのように使いたい、そう思って来たのですが、公開されている情報が少ないです。F#の選択枝もありますが、いつか業務に使っているソフトをOSに依存しないものにしたいと言う望みがあります。さて、今回はGrid。 Gridは表現力があって…

Data.Array を使った半角カナ文字の全角文字列変換。

必要なので半角カナ文字を含む文字列を全角文字列に変換する関数を書きました。 半角文字のUCS4コードはSJISと同じ順序で並んでいますので、半角文字をそのまま配列の添え字に使って全角文字を取得しています。まず、listArrayで半角カナ文字コードと同じ順…

Monoid の使い道が思い浮かびません・・・

とりあえず、Nil と Cons によるリストでmemptyとmappendを定義してみましたが、元々Haskell のリストはMonoidなので意味がありません。 import Data.Monoid data List a = Nil | Cons a (List a) deriving(Show) instance Monoid (List a) where mempty = N…

wxHaskell で IME を制御する。(WIN32API)

最初、wxHaskell で HWND を取得する方法が分からず、WIN32APIを呼ぼうとしましたが、うまくいきませんでした。wxHaskell で HWND をとる方法を見つけてwxHaskell で出来るのを知りました。 ボタンを押すたびにIMEのオン、オフ状態が切り替わります。「英数…

Haskellで副作用を起こす(Win32 API によるUTF-16 ⇔ Shift-JIS 変換)

タイトルは釣りです。副作用を起こしているのはHaskellから読んでいるCのライブラリです。 Win32 APIのWideCharToMultiByte、MultiByteToWideCharでUTF-16 ⇔ Shift-JIS 変換を行うには変換結果を格納するバッファを確保してそのポインタを引数に渡し、そのバ…

Foreign.Marshal.Alloc.malloc、Foreign.Storable.peek、pokeを使ってみる。

以前、Win32 APIのMultiByteToWideChar、WideCharToMultiByteを使って UTF-16 ⇔ Shift-JIS 変換するコードを書きましたが、コードの一部にCで記述した部分があります。本当はCを全く使わないでHaskellで書きたかったのですが問題があって出来ませんでした。…

peekCStringでHaskell文字列を作った後はC文字列が書き換えられてもHaskell文字列に影響はない

shiftJisからUtf16、Utf16からshiftJisへの変換では、変換した後にpeekCString、peekCWString関数によってC文字列からHaskell文字列を作ります。C文字列はHaskell文字列返す前にメモリを解放しているのですが、ふとポインタで指している領域が消えると返す値…

Win32 API の WideCharToMultiByteを使って UTF-16 ⇔ Shift-JIS 変換する。

UTF-16 ⇔ Shift-JIS の変換は計算によって行うことが出来ません。 そこで Win32 APIのMultiByteToWideChar、WideCharToMultiByteを使って変換します。 shiftJisToUtf16 Haskell 文字列をWindowsワイド文字列に変換したあとにワイド文字列からpeekCWStringでH…

unfoldr を使って2進数文字列を作る

Data.List に unfoldr という関数が定義されています。どういう使い道なのだろうと思ったのですが、数を2進数文字列に変換できるのではないかと思いやってみました。 Data.Listの例 --A simple use of unfoldr: unfoldr (\b -> if b == 0 then Nothing else …

Haskellで文字列を UTF-32 ⇔UTF-16 変換する。

IBM developerWorks:Unicodeエンコード方式 UTF-8、UTF-16、およびUTF-32間の相互運用方法を参考にUTF-32 ⇔UTF-16変換関数を作ってみました。 Windows COMの内部文字コードはUTF-16を使っています。 一方、HaskellはソースコードはUTF-8で書きますが内部では…

OverloadedStrings を使うと文字列を、Text、ByteString リテラルとして扱ってくれる。

OverloadedStrings 言語拡張を使うとダブルクオートで囲んだ文字列を、Text、ByteString リテラルとして扱ってくれるようになります。あどけない話・Haskellライブラリ入門 (2011年版) {-# LANGUAGE OverloadedStrings #-} module Main where import qualifi…

Haskellで文字列を EUC-JP ⇔Shift_JIS 変換する。

とほほのWWW入門/ 漢字コードについて(各コード間の変換アルゴリズム)を参考にEUC-JPからShift-JISへ変換します。 ASCII このアルゴリズムは全角文字のEUC-JP ⇔Shift_JIS 変換です。ASCIIについては変化ありませんのでそのままリストに追加していきます。 半…

Foldable を使ってみる。

Data.Foldable これはData.Foldableにある例ですが、Tree型のFoldableインスタンスを定義することによってFoldableに定義されている関数を使用できるようになります。 Foldableインスタンスを定義するには、foldMap またはfoldrを定義すれば良いらしい。 imp…

出力する値を型を指定することにより変化させる( Use -XTypeSynonymInstances if you want to disable this)

maxBound、minBound は出力する型を指定するをその型が表現できる最大値、最小値を出力します。 > maxBound::Char -->'\1114111' > maxBound::Int --> 2147483647 > minBound::Char -->'\NUL' > minBound::Int --> -2147483648 これと同じように自分でも出力…

「実装して理解する遅延評価の仕組み 〜 thunkを絵に描いて理解しよう」をRubyで

実装して理解する遅延評価の仕組み 〜 thunkを絵に描いて理解しよう・JavaScriptでHaskellを実装!?をRubyで写経してみます。 Thunk、 Lambda、App、Evaluateクラスは instance_of? により型を調べるためのものです。 Thunk でくるんである以外は lambda から…

TextCtr のフォーカスがオン・オフになったとき背景色を動的に変化させる(wxHaskell)

TAB キーでTextCtrlを移動してフォーカスがON、OFFになたとき、または、マウスでTextCtrlを選択してフォーカスがON、OFFになたときに背景色を変化させたい。 現在どの wxTextCtrl に入力しているか明確にするために、フォーカスがオンになっている wxTextCtr…

Haskell から nkf を直接使って文字コードを変換する。

Cinnamonのインストールが出来たら使ってみます。 NKFの使い方については「Rubyist Magazine 標準添付ライブラリ紹介 【第 3 回】 Kconv/NKF/Iconv」のNKFの部分に丁寧な説明があります。 -- 「標準添付ライブラリ紹介 【第 3 回】 Kconv/NKF/Iconv」より --…

nkf を使用した文字コード変換ライブラリCinnamonのインストール

CinnamonはHaskellからnkfを呼び出し、文字コードを変換するためのライブラリです。便利なライブラリなのですがエラーが発生するため、そのままではインストール出来ません。修正してインストールする手順をまとめました。 こちらよりcinnamon-0.2.tar.gz を…

nkf を使用した文字コード変換ライブラリCinnamonのUCS4->UTF8の変換

nkf を使用した文字コード変換ライブラリCinnamon についてUCS4⇔UTF8の変換にてバグらしきものを発見したと指摘があります。指摘されているのは UCS4 の1文字を Utf8 の複数バイトに変換する ucs4CharToUtf8Chars 関数です。文字列を変換して比較し、ucs4Cha…

Haskell でSJIS文字列に変換したときのバイト数を得る。

Haskell でSJIS文字列に変換したときのバイト数を得る。 ターミナルに表を表示するときには固定幅フォントを使いますが、アルファベット、半角カナの混じった日本語を使って表を表示すると表が乱れてしまいます。 幅が半角フォントは全角フォントの半分です…

COM を学ぶ(11) : HaskellでExcel(ワイド文字列バージョン)

Haskell から COM を呼ぶ場合 HaskellからSJISに変換した後に MultiByteToWideChar、 WideCharToMultiByteを使用していましたが、Haskell はUcs4、COMはUTF16を使っていますので、日本語で使う分には文字コードを変換する必要はありません。 SysAllocString …

char wchar_t BSTR 文字変換テスト

Haskell から COM を呼ぶ場合 HaskellからSJISに変換した後に MultiByteToWideChar、 WideCharToMultiByteを使用していましたが、Haskell はUcs4、COMはUTF16を使っていて、日本語で使う分には文字コードを変換しなくても良いはずです。 そこで、WideCharToM…