標準入力をブラウザでtail -fできるhtmlcatをHaskellで書いた

GNU screen 使っているとはいえ開発中に諸々のログを流しておくのにウィンドウ使うのに慣れてなくて、タブ開きまくるならやっぱりブラウザを使いたいってことで、標準入力をブラウザに出してくれるツールを書きました。 標準入力をブラウザで tail -f できる…

モナドトランスフォーマーとmonad-control

アドベントカレンダーのいいネタが無いなあと思っていたところ、ちょうど週末にあたらしいmonad-controlがリリースされたので、これを紹介したいなと思いました。その前に、モナドトランスフォーマーというかっこいい名前の代物の話をちょっとだけしましょう…

函数プログラミングの集いに参加してきました

毎年、OCamlミーティングというイベントが開催されているそうなのですが、今年はICFPが東京で開かれることもあり、OCamlに限らない関数プログラミングのお祭りとして開催された「函数プログラミングの集い」に参加してきました。参加者の使用言語の分布が知…

最近のHaskellマップ

函数プログラミングの集い、Language update Haskell編の発表資料です。資料にはいろいろ書いてありますが、大事なことはひとつ、Hugsは死んだと言うことです。 最近のHaskellマップ View more presentations from Mitsutoshi Aoe

HakyllでGitHubのProject PagesのHTMLを作る

GitHub PagesはJekyllが使えるので素直にRubyの流儀に従えばいいのですが、Haskell使いならやはりHakyllを使いたくなります。HakyllはテンプレートにYesodで使われているhamletも使えるので、Yesod使いならなおさらです。というわけでHakyll + GitHub Pages…

Scoped type variablesが必要になるとき

whereの中の局所定義に型シグネチャを付けると Couldn't match type `a' with `a1' ...といわれて型検査を通らない!という経験はありませんか?これを直すには字句的スコープを持つ型変数が必要です。この機能はScopedTypeVariablesという言語拡張によって…

CabalizeされたHaskellプロジェクトでバージョン番号のbump upを忘れないためには

cabalファイルのversionは上げたけど、コマンドラインから--helpしたときに出力されるバージョン番号のアップデートを忘れていた!というのはよくある話です。僕も先日まで知らなかったのですが、cabalizeされたHaskellプロジェクトなら、cabalファイルで指…

TKYProfが少しかっこよくなったので、まじめに紹介します

先日プレアルファ版としてリリースしたTKYProfを少しかっこよくしました。今日はまじめにTKYProfの紹介を書きます。 TKYProfって何? Haskell処理系であるGHCのプロファイリング機能で出力されるテキストファイルを見やすくするためのツールです。具体的には…

GHCのプロファイル出力を可視化するTKYProf

GHCの出力するプロファイル情報はツリー上になっていて比較的読みやすいのですが、プログラムが大きくなるにつれ見にくく・醜くなっていきます。そこでd3.jsというJavaScriptのライブラリとYesodを使って、綺麗なグラフを出すツールを作ってみました。 tkypr…

存在型を全称限量子と代数的データ型でエンコードする

HaskellのGHC言語拡張に含まれる存在型は、existential quantifierを使わずにuniversal quantifierと代数的データ型を組み合わせて表現されます。以前からどうしてこんなことができるのかと思っていたのでそのカラクリを調べてみました。GHC言語拡張では存在…

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

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

Haskellのエディタ支援ツールあれこれ

最近はいろいろなツールの開発が盛んで期待しています。Emacs系で継続的に開発されている or 作り始めでホットなものと言えば次の3つでしょう。 scion ghc-mod haskell-emacs 僕はというと、ベースのメジャーモードは定番(かつ微妙な)haskell-modeで、scio…

GitHubでgitflowを使う

gitflowが便利で気に入っています。人のプロジェクトをforkしたときは、どういう流れで使えばいいのかまとめている文書が見つからなかったので書いておきます。 プロジェクトをfork 手元にclone upstreamの登録など git flow init git flow feature start XX…

プログラミングCoqの2章をHaskellに翻訳してみた

皆さん、小悪魔CoqチュートリアルことプログラミングCoq読んでいますか?僕は大変楽しく読ませていただいています。今日第2章にあたるProof-editing mode であそぼうが公開されました。今回はCoqの証明支援の側面がよくわかる章になっていて興味深いのですが…

代数的データ型を使わないリスト

Haskellでは代数的データ型がよく使われています。取り扱いも簡単だしパターンマッチも便利。たとえばリストは次のように定義できます。 data List a = Nil | Cons a (List a) でも、実は代数的データ型を使わずにリストを表現することもできます。え?さっ…

GADTsとかPhantom typesとかExistential typesとか

長い文章を書くのに挫折したので、短くまとめる。3つを一言で表すとこうなる。 GADTsは、あるデータ型T aがあったとして、データ構成子の結果型がT a以外の型になっているような型 Phantom typesは、データ構成子で使われていない型変数を引数にもつ型 Exist…

Re: Haskell でダックタイピング 、色々な型を混ぜて配列を作る。

この forall a. という表記は冗長な気がするんだけど何で要るんだろう。。。 Haskell でダックタイピング 、色々な型を混ぜて配列を作る。 - 言語ゲーム existential typeのforallキーワードが必要なのには理由があります。元の定義Valをよくみてみると、 da…

The Expression Problem

この記事はHaskell Advent Calendar jp 2010 : ATND向けに書いたものです。最近、ふらふらとネットの波をさまよっていたら、Channel 9でRalf LaemmelさんがHaskellの型クラスを解説する動画を見つけました。これです。 C9 Lectures: Dr. Ralf Lämmel - Advan…

HIMA' #3: Arrow(と随伴関手)

日曜日に3回目のHIMA'を開きました。今回のテーマはArrowとid:itto100penさん一押しの随伴関手でした。ベースとなるテキストは関数プログラミングの楽しみを使いました。 進行は僕が10章「アローと計算」を読み上げ、疑問点が出てきたところでid:msakaiさん…

HIMA' #1: iteratee I/O勉強会

Boost.勉強会 #2と同じ日に同じ場所で、iteratee I/O勉強会を開きました。id:tanakhさんによるIteratee: Teaching an Old Fold New Tricksのまとめ記事を読み上げながら、参加者が気になったところに都度つっこみを入れるという形式で進めました。当初の予定…

iteratee I/O勉強会

勉強会後に加筆修正予定。流れはこんな感じでできるところまで。 概要 iterateeの神秘について語り合う会。 Tweetvite :: iteratee I/O勉強会 参加者10名の予定 集合は15:00 IIJロビーのピアノ前 16:30に休憩を入れて、途中参加者の合流も予定 次回のHIMA'は…

Orphan instances

Haskellのorphan instanceが何者なのか、その意味するところをちゃんと理解してなかったので調べてみた。 orphan instancesとは何? 型クラスの定義ともデータ型の定義とも異なるモジュールで定義されたインスタンス宣言のこと 例: T.hsで定義されたデータ型…

多相的な二分木

Scala勉強中ということで、多相的な二分木を書いてみた。memberとかdeleteは書いてない。2.8からはTraversableなど新しいtraitがあるようなので、それを使うようにするとよりよくなると思う。 Treeを共変にするためには、insertを多相的にして下限境界を指定…

RRD4Jのテキストアンチエイリアス

RRD4Jは出力されるテキストにアンチエイリアスが掛からないので、公式SubversionリポジトリのHEADを勝手にgithubにimportして、小さな変更を入れて公開していたら、作者から取り込ませてくれとメールが来た。快諾したところ取り込まれたみたい。 https://rrd…

PRML復習レーンに参加した

途中までしか予習できずに参加してみたものの、予想通りついて行けなかった。わからないから教えて欲しいけど、何がわからないのかすらよくわからないくらいのレベル。PRMLより先に基礎体力づくりが必要だと認識した。確率統計と線形代数かなあ。正直イミフ…

Functional Programming Meeting 2010

土曜日にOleg Kiselyovさんと單中杰(Chung-chieh Shan)さんを囲む会に参加した。会自体は午前中からやっていたけど、所用で昼からの参加となった。午後の内容はTyped tagless-final interpretations: Lecture notesだった。要約すると簡単な型付きλ計算の…

HaskellのPortage overlay

maoe/portage-overlay · GitHubに公開した。ひとまず Emacsで補完・Flycheckするためのscion FRPライブラリのReactive 並列プログラム用プロファイラThreadScope あたりをアップロードした。あとで使い方を書くかも。GentooのHaskell overlayの中の人に連絡…

Happy Haskelling

金曜日にSimon Peyton Jones氏来日に合わせて催されたHaskellers Meeting 2010 Springに行ってきた。2次会的なものでSPJに、「Haskellプロジェクトやライブラリの中で一番好きな、クールだと思うものは何か」と訪ねたところ、言うまでもなくGHCと言われてし…

ClojureでmapAccumL

こっちはスタックオーバフローする。lazy-seq意味なし。 user> (defn map-accum-l [f s ls] (if (empty? ls) [s []] (let [[ss y] (f s (first ls)) [sss ys] (map-accum-l f ss (rest ls))] [sss (lazy-seq (cons y ys))]))) #'user/map-accum-l user> (map…

Clojureでscanl

lazy-seqはこういうときに使えるのか。 user> (defn scanl [f q ls] (lazy-seq (cons q (if (empty? ls) '() (scanl f (f q (first ls)) (rest ls)))))) #'user/scanl user> (scanl + 0 (range 0 9)) (0 0 1 3 6 10 15 21 28 36) user> (take 10 (scanl + 0 …