あどけない話

Internet technologies

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 概要 外部からのデータに対して、効率の悪いアル…

Haskellのリスト定義の謎

ghci を起動し、":info []" とタイプすれば、リストの定義が表示されます。 > :info [] data [] a = [] | a : [a] これが何を意味しているのか、僕は長い間分かりませんでした。同じように悩んでいる人もいるかもしれないので、説明してみます。まず、第一の…

Haskellの講義に関するQ&A

岡山大学で、関数プログラミングの講義を一コマ担当しました。資料は、函数プログラミングの集いで使った関数プログラミングの道しるべを流用しました。ちゃんと用意しなくて、講義を受けた学生には申し訳ないです。講義内容に関して質問を頂きました。同じ…

書評:Scala スケーラブルプログラミング 第2版

Scala の作者である Odersky らが書いた「Scala スケーラブルプログラミング」の第2版が出版されました。Scalaスケーラブルプログラミング第2版作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘出版社/メーカー: インプレス発売日…

永続二色木

Purely Functional Data Structures の勉強会で説明した二色木(Red-black tree)に関するメモ。Purely Functional Data Structures作者: Chris Okasaki出版社/メーカー: Cambridge University Press発売日: 1999/07/01メディア: ペーパーバック購入: 5人 クリ…

リストの畳み込みと展開

リストの畳み込みには、foldr が使われる。 foldr :: (a -> b -> b) -> b -> [a] -> b foldr _ ini [] = ini foldr op ini (x:xs) = x `op` foldr op ini xs Data.List には、この双対となる関数 unfoldr が定義してある。 unfoldr :: (a -> Maybe (b,a)) ->…

右も左も分かる再帰

「函数プログラミングの集い」のチュートリアル資料を作成するためのメモ。リストに対する再帰を2つに分類することで理解する。 再帰 関数プログラミングでは、繰り返しを再帰で実現する。入力がリストである関数を実装するとする。この種の関数は、出力の種…

(続)Haskell(GHC)での軽量ユーザスレッドの実装方法

Haskell(GHC)での軽量ユーザスレッドの実装方法で、Cmm が軽量スレッドのポイントと書きました。しかし、GHC の実装者 Simon Marlow 先生から「Cmm は関係ないよ」と教えて頂きました。 StgCall StgCall がいくつかのレジスタを保存するのは、採用しているC…

カリー化談義

最近、スタートHaskellで「カリー化された関数のメリットは何か?」という質問が出た。そのすぐ後に、kmizuさんがカリー化の誤用に対して警鐘を鳴らしてしていた。僕からするとkmizuさんの「カリー化の定義」も誤用に思えたので、調べるとともに考えたことの…

Haskell(GHC)での軽量ユーザスレッドの実装方法

命令型言語の Java や Ruby がユーザスレッドからカーネルスレッドに移行したのとは対照的に、関数型言語の Erlang や Haskell では軽量なユーザスレッドを提供することに成功しています。僕は、この違いが何から生じているのか理解したいと思っています。こ…

Haskellの文法(再帰編)

構造化定理によれば、分岐、反復、逐次があれば、すべてのロジックは記述できます。分岐については、Haskellの文法(分岐編)で説明しました。今日は反復について説明します。逐次に関しては、少し難しい内容ですが、QAで学ぶMonadを読んで下さい。 for 文 多…

Haskellの文法(分岐編)

僕が Haskell を学び始めた頃、Haskell の文法はすんなりとは頭に入ってきませんでした。もともと僕はプログラミング言語の学習能力が低いので、僕だけかもしれませんが、「はじめからこう言ってもらえれば分かったのにぃ」ということを書きます。 はじめの…

Haskell から見た node.js

誤訳 以前、「サーバサイドJavaScriptのNode.js、最初はCやHaskellを検討し失敗。開発者ライアン・ダール氏へのインタビュー」という記事が twitter で話題になっていました。 ―― なぜJavaScriptを選んだのでしょう?ダール氏 実は最初は違いました。最初はC…

HaskellとDSL

LL Planets の「メタプログラミングの光と闇」で Haskell について話してきました。Perl、Python、Ruby が概ね内部 DSL を作る話だったのに対し、Haskell では外部DSLを内部に埋め込むという話をしました。短い時間で説明不足になった感があるので、この記事…

FreeBSD に Haskell Platform をインストールする方法

FreeBSD の ports の GHC は 6.10.4 でがっかりするので、自分で GHC 7.0.3 を入れる。GHC 7.0.3 の FreeBSD 用バイナリはあるけど、Haskell Platform のバイナリはないので、結局手で入れる。/usr/local/ghc7.0.3 に入れるとする。まずこのディレクトリを作…

書評「Coders at Work」

「Coders at Work」は、15人の有名プログラマーに対するインタビューをまとめた本だ。私は5人のインタービューを読んだ時点でこの記事を書いている。Coders at Work プログラミングの技をめぐる探求作者: Peter Seibel,青木靖出版社/メーカー: オーム社発売…

Haskellの開発ツール (2011年版)

Haskell開発に関係するツールをとりとめもなく列挙してみます。 エディタ/IDE 僕は、Emacs と haskell-mode と ghc-mod を組み合わせて使っています。haskell-mode は、行頭揃えの機能がしょぼいので、作り直したいと思っています。IDE のバックエンドとして…

Haskellライブラリ入門 (2011年版)

この記事では、基本ライブラリである Prelude の関数をだいたい理解した人が、次に知るべきライブラリを紹介します。自由自在にリストを使いこなせ、正規表現がなくてもプログラミングができるんだなと実感した人を対象にしています。この記事のテーマは、脱…

2011年に Haskell を始める人のために

適切な一歩を踏み出すか否かは、大きな違いを生みます。この記事では、2011年に Haskell を始める人のために、著者が考える最適な入門方法を示します。 Haskell Platform をインストールする 昔人気のあった Hugs は、もう保守されていません。現在は、GHC …

Haskell でスリープソート

Haskeller から見れば、標準出力に表示なんてダサい。orz import Control.Concurrent sleepSort :: [Int] -> IO () sleepSort = mapM_ (forkIO . sleepy) where sleepy n = threadDelay (n * 1000) >> print n

ファーストクラスIOと部品プログラミング

Haskell 界隈では、生産者/消費者のモデルとして、Enumerator/Iteratee (EI)が流行っている。しかし、EI を理解するのは難しい。そこでこの記事では、もっと簡単な生産者/消費者モデルを示す。EI は Enumerator が Iteratee に push する push 型だが、紹介…