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…

プログラミング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で定義されたデータ型…

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と言われてし…

やさしいFunctional reactive programming(Behavior編)

注意: このエントリは書きかけです。前回はHaskellのFRPライブラリのreactiveについて取り上げ、Eventの使い方を紹介しました。今回はFRPにおいてEventと並んで重要なBehaviorを見ていきます。 Behaviorとは Behaviorについては前回触れましたが、再度おさら…

やさしいFunctional reactive programming(Event編)

前回はFRPのBehaviorとEventという重要な概念と、Haskellでの代表的なライブラリを簡単に紹介しました。今回は紹介したものの中からreactiveというライブラリを取り上げます。なお、reactiveを理解するにあたってLess Sugar/More Meat » Blog Archive » Intr…

やさしいFunctional reactive programming(概要編)

あと、やはりネットワーク周りなどI/Oの多いプログラムの書きにくさが課題になっている印象。関数的なI/OはFRPで解決できそうな気がするんだけど調べてない。そろそろFRPをちゃんと理解したいなー。 Parsec 3活用事例: Keepalived構文チェッカ - maoeのブロ…

ghc-6.12.1

リリースされたらしい。Unicode I/Oとか並列プログラムの速度改善とかThreadScopeとかに期待。 こんにちは世界 とってもいい感じ。 maoe@maoe tmp $ cat Hello.hs main = putStrLn "こんにちは世界" maoe@maoe tmp $ runhaskell Hello.hs こんにちは世界

遅延I/Oとメモリリークのつづき

id:maoe:20091108:1257701870の件をhaskell-ja(chaton)で相談してみたところ、nwnさんとnobsunさんに教えていただきました。ありがとうございました。せっかくなので、こちらにもまとめを書いておきます。 先のエントリで意図していた例 元々意図していた…

遅延I/Oとメモリリーク

先週の土曜日にReal World Haskell読書会に行ってきた。とても有意義な読書会だったのだけど、遅延I/Oとメモリリークに関して腑に落ちない点があったので書いてみる。 遅延I/Oの例 Real World Haskell 7.4.1節の注意マークのところ、邦訳版から引用すると、 …

haskell-keepalivedのRPM

keepalived.confのチェッカーであるところのhaskell-keepalivedのCentOS 5(x86_64)用のRPMをアップロードした。中身は/usr/bin/kcというバイナリが一つあるだけ。パッケージ名とプロジェクト名とコマンド名が全部違ったり、x86_64用しかないのはversion 0.…

再帰のパターン

Fun of Programming (Cornerstones of Computing)の3章「Origami programming」の冒頭にはこんな事が書かれている。 One style of functional programming is based purely on recursive equations. Such equations are easy to explain, and adequate for a…