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

Maybe ユーティリティ

Maybe 型を便利に操作する関数「Haskell 98 言語とライブラリ 改訂レポート / 18 Maybe ユーティリティ」を写経してみます。今まで自分で作っていました・・・Orz isJust :: Maybe a -> Bool > isJust (Just 10) -- > True > isJust Nothing -- > False isNo…

モナドって何だろう

モナドを使うと何が良いのか、モナドを使った場合と使わない場合を比較してみます。 関数プログラミングはデータに何度も関数を適用することにより希望する出力を得ます。データを引数として関数を適用し、その結果に関数を適用し・・・と関数プログラミング…

Parsecにちょっと触ってみる(8): try はパースに失敗しても入力を消費してないように振る舞う。

Parsec, 高速なコンビネータパーサ 「string "(a)" string "(b)"」は"(a)" または "(b)" にマッチすることを期待したパーサ。 "(a)" にはマッチする > :m Text.ParserCombinators.Parsec > parseTest (string "(a)" <|> string "(b)") "(a)" -- > "(a)" "(b)…

FizzBuzz で学ぶ

Haskell で FizzBuzz。 再帰 で recFizzBuzz :: Int -> [String] recFizzBuzz = reverse.recFizzBuzz' recFizzBuzz' :: Int -> [String] recFizzBuzz' 0 = [] recFizzBuzz' n | n `mod` 15 == 0 = "FizzBuzz":recFizzBuzz' (n-1) | n `mod` 3 == 0 = "Fizz":…

Parsecにちょっと触ってみる(7): 連接と選択

Parsec, 高速なコンビネータパーサ do 記法を使えば連続してマッチするパーサを作ることが出来ます(連接)。 > :m Text.ParserCombinators.Parsec > parseTest (char 'a') "abc" -- > 'a' > parseTest (do{char 'a';char 'b'}) "abc" -- > 'b' > parseTest (d…

foldl1,foldr1,scanl1, scanr1

Haskell で Ruby の [a, b, c].join(x) と同等のことをするには intersperse が便利。 > concat $ Data.List.intersperse "-" ["abc", "def", "ghi"] -- > "abc-def-ghi" -- intersperse を自分で作るとこんな感じ。 intersperse' :: a -> [a] -> [a] inters…

Parsecにちょっと触ってみる(6):Parsec で掛け算

しばらくやっていなかったのですっかり忘れました。Parsec, 高速なコンビネータパーサ を参考にして簡単な掛け算。 パースは何をするものかと言うと、数字文字列から本物の数字、S式の文字列から本物のS式、配列の文字列から本物の配列を作ります。文字列か…

出力する型を指定することによって違う型を返す関数

return や pure は出力する型を指定することによって違う型を返します。 ghci> (return 123)::IO Int -- > 123 ghci> (return 123)::[Int] -- > [123] ghci> (return 123)::Maybe Int -- > Just 123 ghci> :m + Control.Applicative ghci> (pure 123)::Maybe…

Haskell のループ

Haskell のループと言うと何でも再帰させてしまいます。 map、fold もあるのですが、特にリスト内包表記は使っていませんでした。 フィボナッチ数 フィボナッチ数 1つがいの兎は、産まれて2か月後から毎月1つがいずつの兎を産む。 1つがいの兎は1年の間に何…

Text.Printf.printf を使ってみる

Text.PrintfはC言語のprintfライブラリに機能が似た関数で引数の数もC言語のprintfと同じように変化させることが出来ます。最初の例では文字列に含まれる %s、%d 、%.10f が引数の値が展開される部分です。 3箇所%で指定してあり、3個の引数が渡されています…

hackage.haskell.org に繋がるようになりました。

IPv6を有効に ある時期から hackage.haskell.org に繋がらないという状態になり、UbuntuでIPv6を有効にする方法を参考にIPv6を有効にしたところ、hackage.haskell.org に繋がるようになりましたが、www.haskell.org には繋がらなくなってしまいました。 IPv6…

Data.Time.Calendar で日付の計算をする。

Data.Time.Calendar を使って日付の計算をしてみます。 Data.Time.Calendar の日付は1858-11-17を0とした修正ユリウス日により管理されています。 数年にわたる2点の日数を計算するのには、紀元前4713年1月1日正午からの日数であるユリウス日に変換して計算…

wxHaskell の再インストール(ld.exe: out of memory allocating 28119168 bytes)

Windows Vista の再インストールに伴いHaskellPlatform 2011.2.0.1をインストールしました。「wxHaskell をインストールする」と同じ手順でインストールしようとしたところトラブルがありましたので、メモしておきます。 http://sourceforge.net/projects/wx…

pure は良きにはからって型を合わせてくれます。

Applicative functorsに pure という関数が登場します。 その役目は Monad の return に似ています。 まず、 return の復習、というより良く分かっていませんでした・・・Orz class Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> …

Haskell の文字列に含まれる全角英数字を半角に、半角英数字を全角に変換する。

入力された文字列の英数字を全角から半角に変換したい場合があります。 Haskell の内部コードは UCS4 が使用されています。UCS4 では ASCII の文字は1バイト文字列と同じ順序で領域が割り当てられています。それに対応する全角文字は 0xff01 から割り当てら…

hFlush stdout

Learn You a Haskell for Great Good!を写経して学習しています。 以下のソースは Learn You a Haskell for Great Good! / 9 Input and Output / Exceptions を基に入力したファイルが存在しなかった場合はリトライするように書いたつもでした。 import Syst…

Haskell から MultiByteToWideChar を呼び ShiftJIS←→UTF16 変換する

Windows のターミナルでは SJIS の文字以外は文字化けすることから、Windows で Haskellを使う場合は常にSJISへの変換が必要になります。 Windowsは内部ではユニコード(UTF16)が使われています。ユーザが実際に触れるのは ShiftJIS ですから、Windowsはには…

Cinnamon で半角カナを全角カナに変換したくない場合は直接 nkf を呼び出す。

Windows環境でHaskell を使っています。文字コード変換にはCinnamonを重宝に使っています。 Cinnamonは内部で nkf を使用しています。半角カナを変換しないでそのままにするには nkf のオプションに x を含めなければならないのですが、Cinnamonでは指定され…

unsafePerformIO を使って IO を外す

■ Haskell 再入門Haskell(前編)に unsafePerformIO を使って IO を外す例がありましたので写経してみました。 import System.IO.Unsafe configFileName = "config.txt" loadConfig :: IO (String,Integer) loadConfig = readFile configFileName >>= \dat ->…

USC4 ←→UTF8 変換を調べてみました。

Haskell の内部ではUSC4を使用しています。 UTF8 に変換するには以下のテーブルにより行います。 <http://www.ietf.org/rfc/rfc2279.txt> UCS-4 range (hex.) UTF-8 octet sequence (binary) 0000 0000-0000 007F 0xxxxxxx 0000 0080-0000 07FF 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 1110xxxx 10</http://www.ietf.org/rfc/rfc2279.txt>…

Haskell で PostgreSQL のドライバを書く

Haskell で PostgreSQL のドライバを書いてみました。C を使わないでも出来ました。 参考にしたところ PostgreSQL 文書 / IV. クライアントインタフェース / 第 31章libpq - C ライブラリ PostgreSQLで作るLinuxデータベース(3)PostgreSQLをプログラムで操…

Haskell の 文字コード

ODBC 接続した SQL Server から取得した文字列が化けるので、文字コードについて調べてみます。 kcode という各種文字コードを表示するツールがありますので文字コードを表示してみます。 kcode - 各種文字コードを表示する(Perl) iso-2022-jp :俗に言う「JI…

Haskell で SQL Server へ ODBC接続

【データ ソース (ODBC)作成】 「コントロール パネル\システムとメンテナンス\管理ツール」から「データ ソース (ODBC)」を開きます。 システムDSN のタブを開き「追加」で「SQL Server」を選択。 「名前」(サンプルでは「DSN=DSNname;」)を入力し、「サ…

逆ポーランド記法計算機

「Learn You a Haskell for Great Good!」の「Reverse Polish notation calculator」を計算途中の様子を表示するようにしてみました。 import Data.List import Debug.Trace solveRPN :: String -> Float solveRPN = head . foldl foldingFunction [] . word…

do記法よりも明示的に(>>=)を使う(2)

do記法よりも明示的に(>>=)を使った方が綺麗で分かりやすい場合がある。 do記法 import System.IO main = do todoItem <- getLine appendFile "todo.txt" (todoItem ++ "\n") 1行入力して次のブロックへ渡し、それに改行を付けて次へ、そして、"todo.txt"に…

Haskell で PostgreSQL を扱う:「遅延読み込み」

前回は connectPostgreSQL でコネクションを確立して quickQuery'で読み出しましたが、今回は prepare を使った読み出しです。 SQLの「PREPARE で SQL を準備し、EXECUTE によりパラメータのみの実行」に相当します。 -- ghc --make -o sel -LC:\PostgreSQL\…

RedHat系とDebian系の違い

会社では CentOS、自宅では Ubuntu を使っています。 サービスの起動等の違いを調べたのでメモしておきます。 chkconfig : CentOS $ sudo /sbin/chkconfig --help chkconfig バージョン 1.3.30.2 - Copyright (C) 1997-2000 Red Hat, Inc. このソフトウェア…

幅優先探索(Breadth first search) で迷路を解いてみる

幅優先探索(Breadth first search)で迷路を解いてみました。 wikipedia に記述されている幅優先探索(Breadth first search)は以下の手順で探索します。 根ノードを空のキューに加える。 ノードをキューの先頭から取り出し、以下の処理を行う。 ノードが探索…

Data.Vector を使って迷路を解いてみる

Data.Vectorが配列のように使えて便利と Twitter で聞きました。一時話題になった迷路の問題を Haskell で解いてみました。 instance を使ったのも始めて。 import Data.List import qualified Data.Vector as V -- 関数と引数を逆に記述する関数 --「F# を…

List と ByteString の速度を比較する

List と ByteString を比較してみました。 以下のようなテキストファイルを読み込み、ファイル内に書かれた数字の文字列を数字に変換し、合計を算出するものです。 $ cat num.txt 127 69 76 70 1 1 1 0 0 0 0 0 0 0 0 0 2 0 3 0 1 0 0 0 64 158 4 8 52 0 0 0…