あどけない話

Internet technologies

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

Haskellの単体テスト最前線

この記事の最新版は、githubで管理されています。これはHaskell Advent Calendar 2012の5日目の記事です。Haskellで作成したパッケージに対して、単体テストを書くための最新情報をお届けします。 要約 要点は4つです。 利用者に見せたい振る舞いは、doctest…

型クラスとモナドと Free モナド

要約:Free モナドは何が嬉しいのかを議論するためのたたき台。以下の2つの論文に載っている例を3つの方法で実装する。 Janis Voigtlander, "Asymptotic Improvement of Computations over Free Monads" Wouter Swierstra and Thorsten Altenkirch, "Beauty …

なぜ Haskell ではキューが軽んじられているか?

Haskell ではキューが欲しくなったら Data.Sequence を使えと言われる。Seq は両端キューだし、シーケンスとして使えば、連結(>finger treeなのでコードが複雑なのと、計算量が「ならし」なところが玉に傷である。もっと単純で、最悪計算量を保証する(両端で…

PFDS 10.3 Trie

Trie は、分岐のみで値を持たないノードを許す多分木。 Radix tree(Patricia)は、すべてのノードに値を持つ多分木。各ノードはキーの差分を持つ。 Trie 本のコードは抽象的過ぎて分からないので、3ステップで理解する。 素朴に Map を使う Trie Map を型変数…

Haskellの配列でクイックソート

Haskell の クイックソート としては、以下のようなコードがよく例に出てきます。 quickSortList :: [a] -> [a] quickSortList [] = [] quickSortList (x:xs) = quickSortList lt ++ [x] ++ quickSortList gt where lt = filter (<x) xs gt = filter (>=x) xs これは、小さなリス</x)>…

STMで解く「食事する哲学者の問題」

Haskell で STM を使えばデッドロックがなくなる例として、食事する哲学者の問題を考えてみる。 デッドロックするコード 食事する哲学者の問題では、箸がロックの役割を果たす。Haskell の軽量スレッド間でロックを取るには、MVar を使えばよい。以下のコー…

String vs ByteString vs Text (その1)

文字列っぽいライブラリの使い方に関するメモ。後でまとめるため。コーディングの方法は、(ViewPatternを使わないとして)こんな風に変わる。ByteString も Text も IsString のインスタンスなので、OverloadedStrings を指定すると、文字列リテラルが使える…

Ubuntu 12.04 server(x86_64) に Haskell Platform をインストールする

僕の場合、/ghc-7.4.1 にインストールするので、以下のようにディレクトリを作る。 % sudo mkdir /ghc-7.4.1 % sudo chown 自分のアカウント名 /ghc-7.4.1 GHC に必要なパッケージをインストールする。64ビット環境で libgmp3-dev を入れるとはまるので、lib…

Haskell でのデバッグ

「純粋関数型言語はデバッグしにくい。だって純粋な関数で printf デバッグできないから」とつぶやいている人をよく見かけます。これまで放置してきましたが、リツイートが50を超えたので、Haskellでのデバッグについて書きます。例外処理と同じように、Hask…

Haskellでの例外処理(その2)

Haskell での例外処理の続き。今日は例外を投げるよ! throwIO IO の中で、例外を投げるには throwIO を使います。 throwIO :: Exception e => e -> IO a Exception型クラスのインスタンスを渡せばよさそうです。Control.Exceptionのマニュアルを読むと、Exc…

Haskell での例外処理

リツイート数が30を超えたので、Haskell での例外処理について説明します。僕が思うに、Haskell での例外処理が分かりにくいのには、2つ理由があります。 ライブラリの混乱 パラダイムの違い 歴史的経緯により、Prelude にも Control.OldException にも Cont…

おまけ

本書の出版を記念して、5月27日にHaskell Dayを開催します。Haskellに興味がある人なら、誰でも参加できます。

すごいHaskellたのしく学ぼう!

ゾウ本こと「Learn You a Haskell for Great Good!」の訳本が、ついに発売されます。Learn You a Haskell for Great Good!: A Beginner's Guide作者: Miran Lipovaca出版社/メーカー: No Starch Press発売日: 2011/04/15メディア: ペーパーバック購入: 1人 …

Yesod の設定

web アプリのき開発中はローカルホストで検証し、実際のサービスはリバースプロキシの後ろで運用する方法は、たったこれだけ: yesod init する config/settings.yml を適切に変更 yesod init すると、Foundation.hs に以下のようなコードがある。 instance …

doの中のif

Haskellの文法はかなり心地よいが、もちろん嫌な点もある。その代表例が、do の中の if 式である。if は一つの式を成す必要があるので、以下のように行を下げないといけない。 deleteFile :: FilePath -> IO () deleteFile file = do exist <- doesFileExist…

なぜConduitなのか?

Iteratee という概念は、Haskell 界に適切な資源管理と合成可能な IO をもたらした。そして、以下の3つのパッケージが乱立することになった。 iteraee enumerator iterIO 昨年の ICFP の際、Iteratee の生みの親である Oleg さんに「この状況をどう思ってい…

HaskellとテストとBDD

Haskellでの BDD を実践するとどうなるかを考えるためのメモ。 型 豊かなデータ型とセクシーな型システムを持つ Haskell では、型が以下のような意味を持つ。 仕様 保守性の向上 簡単なドキュメント 設計図 BDD では、テストの用語ではなく設計の用語を使っ…

ハッシュテーブル攻撃とHaskell

以下を理解しようとしたときのメモ: Efficient Denial of Service Attacks on Web Application Platforms slides n.runs-SA-2011.004 - web programming languages and platforms - DoS through hash table 概要 外部からのデータに対して、効率の悪いアル…