あどけない話

Internet technologies

Haskell

Haskell で Y コンビネータ

Haskell では、Y コンビネータが作れないと誤解している人がいるので、できることを示すと同時に、これまで学んだことをまとめてみます。 遅延評価を活かした Y コンビネータ 関数名を用いた再帰を使ってよいなら、Haskell では遅延評価のおかげで、Y コンビ…

「プログラミングHaskell」の増刷

おかげさまで「プログラミングHaskell」の増刷が決まりました。第1版第1刷の誤植表に載っていない間違いを発見した人は、今すぐ報告していただけると助かります。間に合えば、第2刷に反映したいと思います。プログラミングHaskell作者: Graham Hutton,山本和…

Parsec2と3

GHC 6.10 に付随していた Parsec のバージョンは 2 だ。現在の Parsec のバージョンは 3 であり、以下のような特徴がある。 モナド変換子として実装されているので、下回りを自由に変更できる。 ByteString をモナドのインスタンスにすることで、入力に Byte…

いろいろソースを公開しました

重い腰を上げて、3つのソースを公開しました。 Piki Pikiのソースを github で公開し、Pikiバージョン0.3.0をHackageに登録しました。バージョン0.2からの機能追加はありません。Cabal に対応したことと、Applicative スタイルに直せるところは直したことが…

Haskell で書いた HTTP サーバー

Haskell で書いた HTTP サーバー Mighttpdをリリースしました。Mighty (マイティー)と読みます。興味のある人は、遊んでみて下さい。これまで Mew.org は Apache で運用してきましたが、すでに Mighttpd に置き換えています。

素数判定

要約:素数判定に使われるミラーラビン法を解説しながら、Haskell で実装してみる。 フェルマーテスト 大きな数を確実に素数だと判定するには、大変時間がかかるので、実用的には「ほぼ素数だ」と確率的に判定する。確率的な素数判定の代表格がフェルマーテ…

制約プログラミングのススメ

IIJ 社内でやったチュートリアル 純粋関数型言語Haskellの紹介 〜制約プログラミングのススメ〜 の資料を公開しました。

正規表現を超える--CSVファイル編

正規表現を超えるの補足として、CSVファイルを例に挙げて考えてみる。CSVファイルの定義は、RFC4180にある。 file = record *(CRLF record) [CRLF] record = field *(COMMA field) field = (escaped / non-escaped) escaped = DQUOTE *(TEXTDATA / COMMA / C…

Parsecで範囲指定

Parsec には以下のようなコンビネーターが存在する。 many p -- p を 0 回以上 many1 p -- p を 1 回以上 count n p -- p を n 回 しかし、正規表現の"{min,max}"のような範囲指定はない。そこで実装してみた。 import ApplicativeParsec range :: Int -> In…

2009年忘年会

haskell-jp にアナウンスしましたが、読んでいないという人がいるようなので、こちらにも書きます。2009年忘年会のWikiページができています。参加者には全員発表してもらいますので、各自テーマを選んで下さい。

Haskellと副作用

よく、Haskellには副作用がないと言われるが、それは間違いだ。確かに、Haskell には状態の変化(あるいは再代入)という副作用はない。しかし、入出力という副作用はある。この記事では、Haskell の副作用に対して、命令型プログラマーにすっきりと理解でき…

GHC は再帰を末尾再帰に最適化するか?

GHC に -ddump-simpl オプションを渡すと、Core 形式(中間表現の関数型言語)を出力するというので、Performance/Accumulating parameterのコードに対して Core を出力しみた。 len 末尾再帰でない len のコードはこう。 len :: [a] -> Int len [] = 0 len …

プログラミングHaskellの裏舞台

中村正三郎さんがプログラミングHaskellの書評を書いてくれましたので、触発されて少し補足します。 訳について 直訳を避け、意訳する 訳は、直訳を避け意訳を心がけました。原文が想像できない自然な日本語を目指しています。たとえば、章のはじめには必ず…

遅延評価と末尾再帰と余再帰

遅延評価では再帰の効率はどうなるかという問題です。Real World Haskell で、末尾再帰は重要だと言った後に、遅延評価では末尾再帰なんて気にするなとちゃぶ台を返しています。ようやく haskell-cafeで答えを見つけたので、Luke Palmer さんの許可を得て訳…

Haskellerはプログラミング界の立川談志である

昨日の Haskell ナイト用に作ったスライドがあったんですが、見せるタイミングがありませんでした。悔しいので、ここに書いちゃいます。 Haskellerはプログラミング界の立川談志である。 なぜなら、多くのプログラマーはLisperに憧れている(らしい)。 たと…

Haskellで賢人鳥(またの名をYコンビネーター)

賢人鳥で書いた内容の訂正です。unsafeCoerce を使えば、Haskell でも自己言及するコードが書けます。すなわち、ものまね鳥はこうです。 import Unsafe.Coerce m x = x (unsafeCoerce x) という訳で、チョウゲンボウとホシムクドリから賢人鳥を導出してみま…

Haskellナイト

関係筋によるとHaskellナイトにはいろいろ特典があるらしい。 来場者すべてに、もれなく「カブトムシのワッペン」が配られる 会場で「Real World Haskell」を買うと、「カブトムシの T シャツ」が付いてくる 「プログラミングHaskell」が特別価格2,500円で販…

プログラミングHaskellの誤植

プログラミングHaskellの誤植をまとめるページを作りました。誤植の報告は、正式にはオーム社へメールですが、僕に言ってもらうので構いません。メールでも、ブログへのコメントでも、チャットでも、口頭でも、何でも OK です。よろしくお願いします。

自分で作る Num の instance

11月14日のHIMAで、みんなが「Num の instance はよく作る」という発言をしていました。Num の instance なんて自分で作るもんじゃないと思っていた僕は衝撃を受け、どういうときに作るのが尋ねました。すると、msakai さんが「有限体での計算」と答え、「す…

プログラミングHaskell

本日刷り上がって参りました。発売は11月11日です。オーム社の方曰く「ソフトカバーなのに、ハードカバーのように平たく開ける特殊な製本」だそうです。Haskellナイトでも販売するようです。では、Haskellナイトでお会いしましょう。プログラミングHaskell作…

HIMA & 忘年会

昨日の RWH 読書会で、内容と日程が決まりましたのでお知らせします。 第2回 HIMA Haskell 好きが IRC で、とめどなくお喋りする会です。デフォルトでは、第一土曜日の夜になっていますが、今回は私の都合で、11月14日(土)となります。内容は Typeclassopeid…

Haskell本の翻訳書

Haskell本の翻訳が2冊、発売されます。 Real World Haskell オライリーの「Real World Haskell」が、同じ名前の「Real World Haskell」で、10月24日に発売される予定です。分厚い本をよく訳したものだと感心します。訳を担当した山下さん、伊東さん、お疲れ…

開催予告

IRC で Haskell のことをだらだらとチャットする HIMA ですが、第二回目は11月14日の夜です。あと、年に4回ぐらいはやりたい Haskell の集いですが、記念すべき第一回目は12月21日の週を予定しています。場所は、神保町。Haskell を肴に酒を呑みましょう!

Emacs での Haskell プログラミングを幸せにする

前から予告していましたが、Emacs での Haskell プログラミングを幸せにするプロジェクトを開始しています。ゆくゆくは、haskell-mode を置き換えたいのですが、とりあえず haskell-mode と共存して、補完とドキュメントの閲覧が幸せになるコードをリリース…

.cabalファイルにタブを入れない方法

Haskell 使いで、Emacs 使いで、Cabal でパッケージを作る人のための話題。あー、ニッチだ。Emacs で .cabal ファイルを作るとき、タブが入ってしまって、cabal configure すると怒られた経験がある人は、.cabal ファイルの先頭に以下の行を入れましょう。 -…

遅延評価だけだと出力の順番が定まらない例

Haskell に関してよく見かける説明は、おおむね次のような感じだ。「遅延評価では、その値が必要になったときに初めて評価されるので、順番が大切な入出力とは相性が悪い。」Haskellの入出力は、基本的にIOモナドを使用しないと扱えない。IOモナドは、入出力…

OpenGL

Haskell の OpenGL ライブラリが新しくなり、副作用として Mac で動かないようになっていた問題は、9月13日の更新で解決されたみたいだ。ようやく、Mac で OpenGL が復活した。しかし、昔作った GLUT を使うプログラムがコンパイルできなくなっていた。どう…

Emacs で Haskell の補完

Emacs の haskell-mode は、補完がないので使いにくいです。という訳で、Haskell の予約語とモジュール名を補完する elisp を書いてみました。haskell-mode と共存します。モジュール名は、ghc-pkg dump を解析して入手します。このパーサーは、Haskell で書…

Programming in Haskell

久しぶりにサポートページを見たら、韓国版が出版されていた。それよりも驚いたのは、練習問題の答が載っていたこと。

例題で比較する状態系のモナド

金曜日に状態系のモナドを説明しないといけないので、例題を書いて比較できるようにしておきます。呪文として、以下のモジュールを読み込んでおきましょう。 import Data.Char import Control.Monad.Identity import Control.Monad.Reader import Control.Mo…