2011-01-01から1年間の記事一覧
Maybe 型を便利に操作する関数「Haskell 98 言語とライブラリ 改訂レポート / 18 Maybe ユーティリティ」を写経してみます。今まで自分で作っていました・・・Orz isJust :: Maybe a -> Bool > isJust (Just 10) -- > True > isJust Nothing -- > False isNo…
モナドを使うと何が良いのか、モナドを使った場合と使わない場合を比較してみます。 関数プログラミングはデータに何度も関数を適用することにより希望する出力を得ます。データを引数として関数を適用し、その結果に関数を適用し・・・と関数プログラミング…
Parsec, 高速なコンビネータパーサ 「string "(a)" string "(b)"」は"(a)" または "(b)" にマッチすることを期待したパーサ。 "(a)" にはマッチする > :m Text.ParserCombinators.Parsec > parseTest (string "(a)" <|> string "(b)") "(a)" -- > "(a)" "(b)…
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, 高速なコンビネータパーサ do 記法を使えば連続してマッチするパーサを作ることが出来ます(連接)。 > :m Text.ParserCombinators.Parsec > parseTest (char 'a') "abc" -- > 'a' > parseTest (do{char 'a';char 'b'}) "abc" -- > 'b' > parseTest (d…
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, 高速なコンビネータパーサ を参考にして簡単な掛け算。 パースは何をするものかと言うと、数字文字列から本物の数字、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 のループと言うと何でも再帰させてしまいます。 map、fold もあるのですが、特にリスト内包表記は使っていませんでした。 フィボナッチ数 フィボナッチ数 1つがいの兎は、産まれて2か月後から毎月1つがいずつの兎を産む。 1つがいの兎は1年の間に何…
Text.PrintfはC言語のprintfライブラリに機能が似た関数で引数の数もC言語のprintfと同じように変化させることが出来ます。最初の例では文字列に含まれる %s、%d 、%.10f が引数の値が展開される部分です。 3箇所%で指定してあり、3個の引数が渡されています…
IPv6を有効に ある時期から hackage.haskell.org に繋がらないという状態になり、UbuntuでIPv6を有効にする方法を参考にIPv6を有効にしたところ、hackage.haskell.org に繋がるようになりましたが、www.haskell.org には繋がらなくなってしまいました。 IPv6…
Data.Time.Calendar を使って日付の計算をしてみます。 Data.Time.Calendar の日付は1858-11-17を0とした修正ユリウス日により管理されています。 数年にわたる2点の日数を計算するのには、紀元前4713年1月1日正午からの日数であるユリウス日に変換して計算…
Windows Vista の再インストールに伴いHaskellPlatform 2011.2.0.1をインストールしました。「wxHaskell をインストールする」と同じ手順でインストールしようとしたところトラブルがありましたので、メモしておきます。 http://sourceforge.net/projects/wx…
Applicative functorsに pure という関数が登場します。 その役目は Monad の return に似ています。 まず、 return の復習、というより良く分かっていませんでした・・・Orz class Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> …
入力された文字列の英数字を全角から半角に変換したい場合があります。 Haskell の内部コードは UCS4 が使用されています。UCS4 では ASCII の文字は1バイト文字列と同じ順序で領域が割り当てられています。それに対応する全角文字は 0xff01 から割り当てら…
Learn You a Haskell for Great Good!を写経して学習しています。 以下のソースは Learn You a Haskell for Great Good! / 9 Input and Output / Exceptions を基に入力したファイルが存在しなかった場合はリトライするように書いたつもでした。 import Syst…
Windows のターミナルでは SJIS の文字以外は文字化けすることから、Windows で Haskellを使う場合は常にSJISへの変換が必要になります。 Windowsは内部ではユニコード(UTF16)が使われています。ユーザが実際に触れるのは ShiftJIS ですから、Windowsはには…
Windows環境でHaskell を使っています。文字コード変換にはCinnamonを重宝に使っています。 Cinnamonは内部で nkf を使用しています。半角カナを変換しないでそのままにするには nkf のオプションに x を含めなければならないのですが、Cinnamonでは指定され…
■ Haskell 再入門Haskell(前編)に unsafePerformIO を使って IO を外す例がありましたので写経してみました。 import System.IO.Unsafe configFileName = "config.txt" loadConfig :: IO (String,Integer) loadConfig = readFile configFileName >>= \dat ->…
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 のドライバを書いてみました。C を使わないでも出来ました。 参考にしたところ PostgreSQL 文書 / IV. クライアントインタフェース / 第 31章libpq - C ライブラリ PostgreSQLで作るLinuxデータベース(3)PostgreSQLをプログラムで操…
ODBC 接続した SQL Server から取得した文字列が化けるので、文字コードについて調べてみます。 kcode という各種文字コードを表示するツールがありますので文字コードを表示してみます。 kcode - 各種文字コードを表示する(Perl) iso-2022-jp :俗に言う「JI…
【データ ソース (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記法よりも明示的に(>>=)を使った方が綺麗で分かりやすい場合がある。 do記法 import System.IO main = do todoItem <- getLine appendFile "todo.txt" (todoItem ++ "\n") 1行入力して次のブロックへ渡し、それに改行を付けて次へ、そして、"todo.txt"に…
前回は connectPostgreSQL でコネクションを確立して quickQuery'で読み出しましたが、今回は prepare を使った読み出しです。 SQLの「PREPARE で SQL を準備し、EXECUTE によりパラメータのみの実行」に相当します。 -- ghc --make -o sel -LC:\PostgreSQL\…
会社では CentOS、自宅では Ubuntu を使っています。 サービスの起動等の違いを調べたのでメモしておきます。 chkconfig : CentOS $ sudo /sbin/chkconfig --help chkconfig バージョン 1.3.30.2 - Copyright (C) 1997-2000 Red Hat, Inc. このソフトウェア…
幅優先探索(Breadth first search)で迷路を解いてみました。 wikipedia に記述されている幅優先探索(Breadth first search)は以下の手順で探索します。 根ノードを空のキューに加える。 ノードをキューの先頭から取り出し、以下の処理を行う。 ノードが探索…
Data.Vectorが配列のように使えて便利と Twitter で聞きました。一時話題になった迷路の問題を Haskell で解いてみました。 instance を使ったのも始めて。 import Data.List import qualified Data.Vector as V -- 関数と引数を逆に記述する関数 --「F# を…
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…