Haskell

「すごいHaskellたのしく学ぼう!」は気配りと楽しさがすごい

本書はHaskellの入門書です。とっても親しみやすい内容と文体で、構成についても、順序を踏んで丁寧に書かれているようです。また日本語(マルチバイト文字)の扱いを付録で解説しているのもポイント高いですね。以下、ざっくり目を通して、これは!と思った点…

ConduitとPersistentを使って高パフォーマンスなDB処理を目指す

Iteratee/Enumerator系の話題がHaskell界隈で騒がれて久しい (日本語の紹介記事)。これらはHaskellで細粒度のリソース制御ができるストリーム処理の方法で、例外処理もやりやすい、という触れ込みだった。曰く、ストリーム処理はリソースの消費量の点で(オ…

型クラスで tagless DSL メタプログラミング

これは Haskell Advent Calendar 2011 の5日目の記事です。 去年も書きましたが、その記事はこちら → Haskell厨を6年やってる俺がOCamlを仕事で2ヶ月使ってみた - keigoiの日記先日の記事 Haskell+タグレスな型付きDSLで楽々!C言語コード生成 - keigoiの日…

Haskell+タグレスな型付きDSLで楽々!C言語コード生成

関数型プログラミング言語とコード生成 HaskellやOCamlなどはコンパイラなどの言語処理系の実装を得意としている。さすがに日常的にコンパイラを実装している人はそう多くないと思うけど、例えばコード自動生成はすぐ試せる割に効き目が大きく、仕事を効率化…

線形型DSL on Haskell (前回参照) の基本的アイデアと難しい点

前回は、線形型をもつ DSL の例として 線形λ計算を挙げ、実装を示した。 これをもっと押し進めれば、ファイルやネットワーク接続などのリソースの「使い方」をより詳しく指定できる DSL をエンコードできるはずだ (きれいに書けるか、使う人が居るかは別問題…

線形型つきドメイン特化言語 (DSL) を Haskell上に実装する

線形λ計算というのは、「変数をちょうど一度だけ使わなければならない」という線形型をもったλ計算だ。これを Haskell で実装してみた。「ファイルが開かれたら必ず閉じる」という制約のような、線形型 (linear type) が必要な DSL の実装の参考になるかもし…

Haskell厨を6年やってる俺がOCamlを仕事で2ヶ月使ってみた

Haskell Advent Calendar jp 2010のためのエントリです(17日目). 6日目の id:camlspotterさんの 経験15年のOCaml ユーザーが Haskell を仕事で半年使ってみた に対するカウンター(になってるかどうか分からないですが)みたいな感じです. 近くて遠い隣…

ビットとview pattern

小ネタ。 ビットパターンをHaskellでパターンマッチできたらいいよね、ということでview patternを使ってみた。 {-# LANGUAGE ViewPatterns #-} import Data.Bits -- | ビット。 I は 1, O は 0 data B = I | O deriving Show -- | 8ビット。 左がMSB, 右がL…

Tickモナドとモナド則

まだHaskellをはじめて間もないころ、「bindの度に何かするモナド」を考えた。例えば、 action = do putStrLn "one." putStrLn "two." putStrLn "three." というコードを実行すると one Hello! two Hello! threeと出力するような。応用すれば、「定期的に yi…

可変状態モナドと安全な入出力とセッション型 in OCaml

今日は関数型言語の型で副作用(入出力)の制約を表現する、というお話を書きます。 (勢いで書いたので、わかりやすいかどうか不明です。) Safeio in OCaml ガリグ先生による Caml-list への投稿に Safeio というお話があります。 任意個のチャネルへの入出力…

multi-promptな限定継続 in Haskell (失敗編&成功編)

multi-promptな限定継続の方が型がわかりやすい件について。なんだかshift/resetの型付けはむつかしいなーと思っていた。 限定継続のOCaml実装を見てみたくて、Olegさんのdelimccライブラリとその論文を眺めていた。 こちらはmulti-promptな限定継続といい、…

限定継続でmap関数をひっくり返す

前回の例はちょっと意味不明だった。単にshiftをmap関数に渡してみたかったのだけど…もっとわかりやすく、shift/reset を使って map 関数をひっくり返したものを作ってみた。 が、やっぱりモナドなので普通のSchemeの例より読みにくいような気もする。まあし…

限定継続モナドと再帰

この記事の続きはこちら三次会では Olegさんによる限定継続モナド を触っていた。 これまで皆が使っているのを指をくわえて見ていたけど、自分でもやっと使いこなせるようになってきた気がする。うれしくなったのでこの記事を書く。説明では疑似Haskellっぽ…

hint から Template Haskell を使って reify

下の記事の続き。 hintは意外に私の欲しい機能がなく、たとえば「あるレコード型のフィールド名をすべて取得」みたいなことができない。Template Haskell の reify 関数なら、任意の識別子について reify が使えるののに… というわけで、 ややアクロバティッ…

hint 使って型推論、 haskell-src-exts を使って Parse

GHC API のラッパー hint を使えばHaskellでも手軽にリフレクションっぽいことができる。例えば動的にHaskellのソースをロードして関数を呼び出す、といったことが数行で書ける。 ところでリフレクション周りで色々やろうとすると、すぐに関数の型を解析した…

full-sessions-0.6.1

full-sessionsの新バージョン 0.6.1 を HackageDBにアップロード しました。 full-sessions は、Haskellにおけるマルチスレッド/ネットワークプログラミングのライブラリです。 Sessionモナドという新しいモナドを使ってプログラムを書きます。 チャネルの型…

iso-再帰型(???)のfoldとunfold?

TAPLのiso-recursive type の説明でfoldとunfoldというのが出てきたけど、それっぽいことをする。 単に再帰型っぽく展開したりたたんだりできるだけで、実際に再帰型を作っているわけではない。 -- 再帰させたい型 data A x = A x deriving Show data B x = …

type families と fundeps の、単一化に関する微妙な差異

昨日の記事に関連するのだけど、 fundeps と type families で一見 同じように見えるが 微妙に異なる挙動を見つけた。ずいぶん込み入った例だけれど、さしあたりの理解のためにこの記事を書く。 ストーリー 例のごとく、私は full-sessionsにおいて 繰り返し…

(相互)再帰 in full-sessions

忘れた頃に full-sessions の開発をやっている。 これまでセッション型の再帰を扱いづらかったので、もっとイージーに使えるようにした。unwind という関数で、再帰の開始点を表すことにした*1。 例えば、 {-# LANGUAGE NoMonomorphismRestriction #-} impor…

型レベルの何か

apply (undefined :: n -> Succ (Succ n)) Zero :: Succ (Succ Zero) 型レベルのλ (System FのΛ)があったらいいのにーという風に理解したのですがそりゃ難しそうに思えます. 難しくありませんでした.何かそれっぽいのができました.知りもしないのに適当な…

型レベル高階関数 (?)

id:eagletmt さんが Haskell の型レをやっているのでコメントをポチポチ書いています ただ,これだとちょっと残念なことがあって,例えば2つ足す場合, data Succ2F = Succ2F instance Apply Succ2F x (Succ (Succ x)) と,わざわざ書かなければならない. …

軽量言語のお手軽なWebプログラミングをHaskellで : Implicit Parameter を使って (未完)

与太話。 Haskell でもお手軽にWebアプリ書きたいんですが、 どうせならいま流行の軽量な感じに書けたら嬉しいのです。そしたら皆にも使ってもらえるよね。 型がうれしいHaskellで軽量にWebアプリが書けたらもう向かう所敵なしだと思う。 アイデア: リクエ…

Haskell+GADTで定理証明 その1: 型レベル自然数の等価性

実は、私のfull-sessionsというセッション型のライブラリは中で unsafeCoerce#を使っているので型安全でない。使ってくれる人にとってそれは心もとないだろうし、そもそもunsafeなんとかは、いけがみさんによればSPJとSimon Marlowしか使ってはいけないこと…

型変数の比較3 - 非等価性は矛盾する

TypeEq による型の非等価性判定は結果として矛盾することがある,というお話.型変数の比較で,引数の型が異なることを表現する関数を作ろうとして次のようなコードを書いたとする: typeEq' x y = type'eq x y :: HFalse ここでGHCのeagerなcontext reducti…

型変数の比較2

http://d.hatena.ne.jp/keigoi/20090709/1247155626 の続き.この話は無駄にUpdateとかの型レを使っていてややこしかったです.ここで紹介したコードを ghciでロードして,次を入力すればわかります: ghci> :t type'eq undefined undefined type'eq undefin…

Text.Printf, もっと安全なprintf

可変長引数のテクニックは普通に Text.Printfで使われてるんですね。 型レ以外ではHaskellをヘビーに触るわけではないので知りませんでした…型安全な printf (引数の過不足や型ミスマッチをチェックできる)については Olegさんの最近のポスト http://okmij.o…

型変数の比較

もっと簡単な例で追記しましたHaskellの型レでは型変数同士の比較ができないぜーというお話をしたんですが、OlegさんのReversing Haskell typechecker: converting from undefined to defined のTypeEqを試したらば、できちゃいました。Haskell型レのバイブ…

Haskell98可変長引数ハックにみる,各処理系のcontext reductionの違い

Olegさんの Generic polyvariadic printf in Haskell98 は、プレーンなHaskell98で可変長引数関数をつくり,printfを実現しています. 関数の型(a->r)は型構築子(->)と型引数a rからなる型 (->) a r なわけで,型クラスのインスタンスでうまいこと回せば、こ…

Sessionモナドの読み方

初回に, Sessionモナドは indexed monad だと説明しましたが具体的にどういう制約が入っているのかをちゃんと説明しませんでした. すべてを一度に説明するのは難しいのですが,とりあえずおおざっぱに説明を試みます 事前条件・事後条件 と プロトコルの差…

セッション型のduality

セッション型の読み方について説明します. セッション型の種類 私のfull-sessionsにおけるセッション型を次のTable 2に示す: セッション型は論文によって表記法が著しく異なるが,多かれ少なかれだいたいここで示した機能(と再帰)がすべてである. Send / …