haskell

プログラミング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…

random walk

より、 偏りのないコインを投げつづけよう。ここで、「偏りのない」とは、「表」と「裏」が等しく0.5の確率で出る事を意味している。投げるごとに、表がでたか裏が出たかを記録する。それぞれの回数はどのように増えていくのだろうか?たとえば、ある時点で…

2次元random walk

前のエントリを2次元に拡張したもの。1次元版ではコインの表裏を+1/-1に対応させていたが、今回は方角、つまり東西南北を縦軸と横軸に対応させる。実験では平面上に100万ステップ分をプロットしている。するとこんな図や、 こんな図になる。おもしろい。 以…

ネストしたincludeに対応するlexer

Cの#includeとか設定ファイルのincludeディレクティブ的なincludeに対応するlexerメモ。「*」指定などのglob対応。Parsec 3で。 tIncluded :: Stream String IO Char => ParsecT String u IO TokenType tIncluded = lexeme $ do try $ symbol "include" glob …

quoteされた文字列用lexer

quoteされた文字列(文字列リテラル)用のlexerメモ。Parsec 3で。 tQuoted :: Stream s m Char => ParsecT s u m TokenType tQuoted = lexeme $ Quoted <$> between (char '"') (char '"') (many quotedChar) where quotedChar = try escapedQ <|> C.satisf…

inet_addrはネットワークバイトオーダーではない

manpageには The inet_addr() function converts the Internet host address cp from IPv4 numbers-and-dots notation into binary data in network byte order. と書いてあるのに、下記プログラムの出力はリトルエンディアンになっているのは何故だろう。 #…

StateT

import Control.Monad.State tick :: State Int Int tick = modify (+1) >> get tickT :: StateT Int IO Int tickT = modify (+1) >> get >>= liftIO . print >> get main :: IO () main = do print $ runState (tick >> tick >> tick) 0 runStateT (tickT >…

自前の例外を扱う

所謂extensible exceptionsというやつ。すぐに忘れそうなのでメモ。 {-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables #-} import Control.Exception import Data.Typeable import Prelude hiding (catch) data MyException = MyException deriving (S…

Control.Concurrent.Chan

最小サンプル。生産者がチャネルに一秒ごとにインクリメントされていく値を書き込み、複数の消費者がチャネルから読み出した値をプリントする。とってもお手軽。 import Control.Monad import Control.Concurrent type ID = Int main :: IO () main = do ch …

賢いお尻の舐め方

でかいファイルの最後の行を取り出したいときにどうすればよいか。Cだったらmmapしてお尻から舐めていけばいい?けど、標準ライブラリにmmapもないのであんまりうれしくない。seekで頑張るならこんな感じか。 import Control.Exception import Control.Monad…

モナドとシェル

モナド則 (return x) >>= f == f x m >>= return == m (m >>= f) >>= g == m >>= (\x -> f x >>= g) はbindをパイプ、returnをcat、fをgrep hogeなどの適当なコマンドとすると、 cat x | grep hoge == grep hoge x grep hoge x | cat == grep hoge x (cat x …