haskell

GHCのヒーププロファイルの結果を適当に間引く

GHCのヒーププロファイラが出力する.hpファイルは、計測対象のプログラムが動いている間ずっと追記されるので、長時間動かしているとファイルがとても大きくなって、hp2any-managerなどで開けなくなってしまう。 そういう場合は.hpファイルの中身を適当に間…

Mac OS XにThreadScopeをインストールする(2015年1月版)

HomebrewのGTK+がQuartzバックエンドに対応したので、XのいらないThreadScopeが使えるようになった。手元の * GHC 7.8.4 * OS X Yosemite な環境では次のコマンドでインストールできた。 brew install gtk+ --without-x11 brew install gcc-4.9 cabal update…

Cabal sandboxで実行ファイルをインストールする

c2hsとかthreadscopeなど、ライブラリではなく実行ファイル + αを含むパッケージをcabal hellに陥ることなくホームディレクトリの.cabalにインストールするには--bindirと--datadirを指定してsandboxにインストールすればよい。 cabal get threadscope cd th…

Debug.Traceで関数の引数を表示するイディオム

Haskellでよくある複数行の関数定義だったり、ガードを使っている場合、全ての場合について引数をtraceするコードが書きにくいことがある。例えば、 data A = A1 | ... data B = B1 | ... data C = C1 | ... f :: A -> B -> C -> ... f A1 b c = ... f a B1 …

HackageでHaddockが生成されない時は

ここのところずっとHackageでHaddockの生成ボットが止まっているようで、新しくアップロードされたパッケージはたいていドキュメントが無い。どうも新しいサーバにHackageサーバを移しているようなのだけど、きっと忙しいんだろう。自分で管理しているパッケ…

あるパッケージのバージョンによって別のパッケージへの依存関係を変更する

具体的にはaesonのバージョンが新しい場合にのみscientificを依存関係に組み込みたいとする。 library build-depends: (aeson >= 0.3.2.5 && < 0.7.0) || (aeson >= 0.7.0 && scientific) こんな感じにできないかなぁと思っていたが、これはparse errorにな…

hpc-coverallsでHaskellプロジェクトのテストカバレッジを可視化する

GHCには昔からHaskell Program Coverage (HPC)というカバレッジを計測する機能とツールがついてくるのだけど、コマンドラインオプションの指定が面倒だったり、そもそもHPCにバグがあって使いづらいためか、あまり広くは使われてこなかった。ところが最近に…

HaskellからInfluxDBを使う

Haskellからお手軽に時系列データベースにアクセスする必要が出てきたので、今巷で人気が出始めたInfluxDBのHaskellクライアントライブラリを書いた。 Hackage: influxdb: Haskell client library for InfluxDB maoe/influxdb-haskell · GitHub ドキュメント…

Pattern synonymsの使い道

もうすぐ出る出ると言われ続けて久しいGHC 7.8は、大きめの新機能がいくつも入る。そのうちの一つがpattern synonymsという言語拡張で、これまで第一級市民でなかったパターンを、再利用可能な部品として扱えるようにする仕組み。チケットが登録されてから3…

Re: Real World Haskellの古いところ

Real World Haskell の古いところ - あどけない話の25章と23章についてのコメントをまとめました。 > id:kazu-yamamotoさんprofilingのところはコンパイルオプションがghc 6系の古いものなので http://t.co/tVoGa7aFzv を見た方が良さそう— Mitsutoshi Aoe/m…

モナディックなループ

しょーもないイディオムの話。モナディックなループを書くとき、だいたい3つくらい宗派があるように思う。 {-# LANGUAGE ViewPatterns #-} module Loop where import Control.Monad (when) import Data.Function (fix) import System.Environment (getArgs) …

詳解bytestring

というタイトルでbytestringパッケージの包括的ガイドを書こうと思ったけど、まさにそんな内容のスライドをbytestringのBuilderを書いた人が公開していたのを見つけてしまったので、是非そちらを見て欲しい。A guided tour through the bytestring library以…

GREEのCUFPでのHaskell事例紹介を見た

社内Haskellチュートリアルのススメ | GREE Engineers' Blogという記事からたどって、GREEの中の人がCUFPでHaskellの事例紹介をした動画を見た。CUFP 2013: Yasuaki Takebe: A Mobile Gaming Platform Case StudyスライドはCommon Pitfalls of Functional Pr…

persistentでEntityのJSONフォーマットを変更するには

Yesod界隈でよく使われているpersistentは、v1.2.0になったタイミングで、Entity a全体に対するToJSONとFromJSONクラスのインスタンスを提供するようになった。このインスタンスのJSONフォーマットがちょっと変わっていて、 {"key": 1, "value": {"name": "T…

2013年8月現在のHaskell開発環境

以前はHaskell Platformを使っていたのだけど、Cabalの依存関係ソルバがあまり賢くなかったこともあり、いわゆるdependency hellに陥ることが多かった。それからというものHaskell Platformを使わない環境を使っている。OS Xでは公式のインストーラやらHomeb…

HaskellでCIするなら

函数プログラミングの集いのランチで聞かれたのでHaskellのテスト環境についてまとめます。 githubに置いているコードを面倒な設定なしにテストしたい → cabal test + travis-ciがおすすめ クローズドなコードなんだけど、どうしよう → jenkinsでもセットア…

SICPのデジタル回路のシミュレータをFRPで書いた

最近FRPなコードを書いているので、ふとid:kazu-yamamotoさんに言われたのを思い出して書いてみました。元の問題はこちらからどうぞ。今回はelereaというライブラリを使っています。FRPとはなんぞやな方はやさしいFunctional reactive programming(概要編)…

undefinedの代わりに$notImplementedを使おう

Haskellで一からコードを書くとき、よく型だけ書いて実装はundefinedにすることがあります。これはとても便利な常套手段なんですが、規模が大きくなってきたり、undefinedな数が多くなってくると不便に思うこともあります。 undefinedとplaceholders 一通り…

htmlcatをSnap対応させました

htmlcatをwai + warpだけでなくsnap-core + snap-serverでも動くようにしてみました。なるべく似たようなコードになるように書いてみました。とても似ています。Snapだとこんな感じ。 {-# LANGUAGE OverloadedStrings #-} module HtmlCat.Snap (feedStdIn, r…

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

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

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

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

最近の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…