Haskell

HaskellのHSQL.MySQLでMySQLを操作する【補足】

in

軽い追加。やっぱ、日本語はあるのでその対応と例外処理。

こっちから行くときは、encodeString

import qualified Codec.Binary.UTF8.String as U
mkdat = do c <- conn
           HS.inTransaction c dats 
           HS.disconnect c
             where 
               dats c = mapM (\q -> HS.execute c (U.encodeString q)) datas

帰ってきた時は、decodeStringでうまくいくようです。

HaskellのHSQL.MySQLでMySQLを操作する

in

仕事ではDBの操作も欠かせないのでHSQL.MySQLも試してみました。APIをザッと見渡してみてexecute/inTransaction/fetch/forEachRow/inTransactionあたりの基本形を書いてみました。

まず、executeで戻りのないクエリの実行。create tableとかdrop tableとかね。

HaskellでFTPクライアント

in

コード片としてPerl/Net::FTPをよく利用していますが、前回に続きこの部分もNetwork.FTP.Clientを使ってHaskellで書いてみました。ダウンロード対象を記述した以下の形式のファイル

# 行頭# はコメント行
remote_file_name,local_file_name
:
:

を読み込んでサーバからダウンロードしリネームして保存するだけのサンプルです。

Graphics.GDを使ってHaskellで画像の切り抜きをやってみた

in

キャプチャした画像を切り取るという頼まれ仕事がきたので、Perl/Image::Magickでやったのですが、フト勉強中のHaskellでも簡単にできるんきゃないかと思ってやってみました。

Project Euler Problem66 ー ペル方程式って何?

in

Project Euler Problem66できたんだけど前回同様肝心なところは理解できずでなんかダウナー気味。Haskell勉強のお題ではじめたPEなので別に数学的なところがわからなくても一向かまわないわけだけどせっかく解くのだからもう少し理解したいなぁ。と痛切に思う次第。ということで、ペル方程式というのがあるらしく、

Project Euler Problem64でとうとうカンニング

in

Project Euler再開してしばらくたちますがすでに壁にブチ当たってます。64問目にして、とうとうカンニングしちゃいました。だいたい、連分数って何よ!?っていう人間には難しすぎる。

というわけで、カツ丼食べながらHaskellで書いたのがこれ。

GHC-6.12.1へのアップデート

in

Stop!の文字をうっかり無視(?)してGHC-6.12.1をインストールしてしまいました。これってHaskell Platformとは違って必要最小限のパッケージしかバンドルしていないんですね。一番上に大きく書いてあるのに....というわけで早速、mtlがないよとか言われてなんだそりゃ?状態。とりあえずcabalはセットアップしてあったので助かりましたがこの先もチクチクとあれがないとかこれがないとか言われると思うとちょっとげんなり。

仕事用のマックにはcabalをセットアップしていなかったからhttp://d.hatena.ne.jp/ymotongpoo/20091227/1261905296を参考にして慌ててセットアップ。HTTPのところでmtl/network/parsecがないと言われましたのでとりあえずhttpパッケージはこれらのパッケージに依存することがわかりました。幸い、すべてhaskell.org/packageにあるものを使ってcabalのセットアップは完了しました。考えてみればProject Euler以外にHaskellのコードを書いている訳じゃないので案外勉強になるかもしれない... (Problem 60が未だにできないのですが...)

Project Eulerが楽しい

in

Haskellの勉強だと思ってProject Eulerはじめたんですが、思いの外ハマってしまって嬉し楽しです。年明けから始めて二月にようやくレベル1まで到達しました。一応、すべての問題をHaskellで解きました。苦労したのはProblem23で、先にC++のプログラムを作成して答えはわかっているのにHaskellでうまく書けずどうやってもStack OverFlow***。再帰再帰がうまくないのはわかっていたので$!とかseqとかいろいろやってみましたがダメ。で、最終的にはData.Arrayを再構築しながら切り抜けました。この方法は、google先生の助けをかりたのですがコピペはしていないのでマイルールには抵触しないです。σ(^_^;)?

この先、問題が難しくなることを考えればどう考えても全問解答まで一年以上かかる計算ですが、楽しくて止められません。

プログラミングHaskell (第八章の練習問題)

in

翻訳片手に再びトライ。この章にあるdo構文は、ghci環境では動作しないこともあり等価の(>>=)を使い(原著p77,翻訳p93参照)ます。また、ghci環境下ではPrelude.>>=と重複するためすべてMainの修飾子を付加しています。

8.10 (1) int::Parser Intを定義せよ

プログラミングHaskell (第八章の練習問題)の前に

in

八章は原著で玉砕していて僕にとっては鬼門です。練習問題に入る前に原著を読んだときに躓いたことを整理しておくと、躓きはテキストの例題にある1番目と3番目をペアで返すpのコード

p = do x <- item'
       _ <- item'
       y <- item'
       return' (x,y)

を入力してもエラーになって先に進めなかったこと。このこと自体はググってみたら、

p = item Main.>>= \x ->
    item Main.>>= \_ ->
    item Main.>>= \y ->
    return' (x,y)

のように、(>>=)を使えばうまくコードを実行できることはわかったのですが、肝心の実装が理解できず苦しみました。例えば、`parse item "abcde"`の結果が('a',"bcde")であるなら、`p "abcde"`は、

return' (('a',"bcde"),('c',"de"))

じゃないの?というところから抜け出せずにい(た|る)わけです。

プログラミングHaskell (第七章の練習問題)

in

7.8 (1) [f x|x <- xs, p x]をmapとfilterを使って書き直すとどうなるか?

a'::[Int]
a' = map f (filter p xs)
  where
    xs = [1,3..50]
    f  = (*2)
    p  = (<18)

まあ、これはいいかな。

7.8 (2) 標準ライブラリの定義をみないでall,any,takeWhile,dropwhileを定義せよ

プログラミングHaskell (第六章の練習問題)

in

新年おめでとうございます。本年もボチボチとよろしくおつきあいいただける僕としてもうれしいです。

6.8 (1) 負でない整数に対する累乗演算子を定義せよ。またその定義で2^3を簡約せよ

(#) :: Int -> Int -> Int
m # 0 = 1
m # (n + 1) = m * (m # n)

(Prelude.^)とバッティングするので(#)にしてます。

 2#3
 = 2*(2#2)
 = 2*2*(2#1) 
 = 2*2*2*(2#0) 
 = 2*2*2*1
 = 8

ところで、僕の解答ですが括弧がないです。一見したときは正しいと思ったのですがこの間違いは大きい気がします。結果の8は同じですが、問題の意図からすれば零点といってもいいくらい。

プログラミングHaskell (第五章の練習問題・シーザーの暗号)

in

5.7 (8) シーザー暗号のプログラムを大文字も扱えるように変更せよ

だんだん、プログラムらしくなってきました。問題のシーザー暗号のプログラムがどこまでのことを指すのか今ひとつわかりませんでしたが、crackの箇所は大文字の出現頻度がわからないのでとりあえず、暗号化するところまで。まず、let2intを改造して大文字もint変換できるように修正します。

プログラミングHaskell (第五章の練習問題)

in

5.7 (1) リスト内包表記を使って1から100の二乗の和を計算する式を考えよ

sum' = sum[x^2 | x <- [1..100]]

まぁまぁ、このあたりは...ね。

5.7 (2) replicateをリスト内包表記を使って定義せよ

プログラミングHaskell (第四章の練習問題)

in

4.8 (1) 偶数の長さをもつリストを半分に分割するhalve::[a] -> ([a],[a])を定義せよ

havle::[a] -> ([a],[a])
havle xs = (take n xs, drop n xs)
where n = length xs `div` 2

リストの長さが奇数でもOKだが?例外をスローすべきなのか?この章までではエラー処理についてはなにも言及されていないのでこのままで。解答には、

halve xs = splitAt (length xs `div` 2) xs

というのもありました。通常、こちらを使うべきですね。

コンテンツの配信