あどけない話

Internet technologies

不動点の話

不動点コンビネータを使うと、どうして無名関数で再帰ができるのかを考えてみる。 名前を取り去る 以下の階乗を計算する関数 fact を考える。 fact 0 = 1 fact n = n * fact (n - 1) これは、以下のように一つの式に変形できる。 fact n = if n == 0 then 1 …

QAで学ぶMonad

この記事は、Monad でつまづいた Haskeller のための Monad 再入門です。 Monadとは何ですか? Monad とは、単なる型クラスの一つです。難しいという風評もありますが、それ以上でもそれ以下でもありません。この型クラスのメソッドは、return と >>= です。…

原発まとめ

ずっとウソだった 福島原発10基の耐震安全性の総点検等を求める申し入れ 未曾有の震災が暴いた未曾有の「原発無責任体制」 想定マグニチュードをひっくり返す 元GE技術者・菊地洋一さん講演 安定運用でも被爆する、現場を知らない推進派、地熱エネルギー …

関数型言語での関数の基礎知識

関数型言語での関数について、Haskell を用いて説明します。 関数の型 関数の型は、-> を使って書きます。例えば、Int を Char に変換する chr という関数の型は、以下のようになります。 chr :: Int -> Char 一引数の関数の型は、まぁこんなもんだと思える…

F# をまねる

F# の |> 演算子がかっこよいので、Haskell で作ってみた。 infixl 0 |> (|>) :: a -> (a -> b) -> b a |> f = f a 以下のようにシェルのパイプのような感じで使う。 foo :: String foo = [1..100] |> map (*2) |> filter (\x -> x `mod` 6 == 0) |> sum |> …

Enumeratorは終了条件の検査からの解放だ

長年の疑問の答えが Enumerator だった。今日はそんなお話です。 findを実装する Real World Haskell の第9章に UNIX の find コマンドを作る例があります。最初は安直に実装してみましょう。まず、ディレクトリの内容を得る補助関数と、ディレクトリが辿れ…

使ってみよう Enumerator

Enumerator Package - Yet Another Iteratee Tutorialは、Iteratee: 列挙ベースのI/Oよりは分かりやすいのですが、やっぱりよく分かりません。なぜなら、僕は使い方を知りたいのに、作り方が書いてあるからです。そこで、Enumerator ライブラリの使い方を簡…

正規表現ちっくなパーサーコンビネーター

たとえば、論文を書いていて、図が本文からちゃんと参照されているかを調べたいとします。LaTeX で書いているなら、\ref{} と \label{} の中の文字列を突き合わす訳です。正規表現を使えば、テキスト全体からこれらの文字列を抽出するのは簡単です。でも、Ha…

Parallel GHC プロジェクトの近況

ことの起こりは Haskell night 2009 だった。パネルの司会をしてくださった赤池さんから、「Simon Peyton Jones さんが2010年4月に日本にやってくるので、日本の人達と会いたいと言っている」と相談された。Simon さんとは「ビューティフルコード」の編集で…

chainl と左再帰

Parsec などが利用する再帰下降構文解析では、左再帰が無限ループに陥るという問題がある。例えば、以下の BNF で定義される数式を考える。 expr ::= expr '+' term | term term ::= term '*' factor | factor factor :: = '(' expr ')' | nat nat = '0' | '…

Cocoa Emacs のピコピコ問題

Emacs 23.2 on Mac でローマかな変換をするときに、文字が上下にピコピコしてうっとうしいという方は、このメールを見て下さい。これを足がかりに、みんなで問題を解決しましょう!

フィボナッチ数列のまとめ

フィボナッチ数列は、自然界に現れる単純にして基本的な数列である。たとえば、ヒマワリの種の並びやミツバチの家系図はフィボナッチ数列を成す。 再帰 フィボナッチ数列の漸化式をそのまま Haskell で実装すると以下のようになる。 fib :: Int -> Integer f…

apの実装を読み解く

Applicativeスタイルの一般的な形は、以下のようになる。 f <$> m1 <*> m2 <*> m3 ... は liftM (あるいは fmap)の別名、ap は の別名だと思ってよい。ap の実装を見てみると、以下のように定義してある。 ap :: (Monad m) => m (a -> b) -> m a -> m b ap =…

禁断の不動点コンビネータ

フィボナッチ数列を汎関数で書く。 fib :: (Integer -> Integer) -> Integer -> Integer fib _ 0 = 0 fib _ 1 = 1 fib f n = f (n-1) + f (n-2) そして、不動点コンビネータを遅延評価を活かして以下のように定義する。(Control.Monad.Fix を import しても …

Applicativeのススメ

この記事の目的は、Applicative 信者による Applicative スタイルの布教です。簡潔に結論を述べると、 foo = do a <- m1 b <- m2 return (f a b) のようなコードを書きたくなったら foo = f <$> m1 <*> m2 と書きましょうということ。合い言葉は、「do と re…

GHCのビルド

GHC 7.0.1がリリースされました。しかし、このページにも書いてあるように、cabal-install が古いとバイナリパッケージのインストールは失敗します。でも、自分でビルドすれば、あなたがインストールしている cabal-install は使わないので、大丈夫です。ビ…

Lisper のためのゲーデルの不完全性定理

注:この記事の内容には、問題があるようなので、勉強して書き直す予定です。ゲーデルの不完全性定理を読んでも理解できない Lisper のために、Lisp のコードで不完全性定理を説明してみる。昨日と同様に Emacs Lisp を使うが、Common Lisp や Scheme でもコ…

Lisper のためのチューリングマシンの停止性問題

停止性問題を読んでも、意味が分からなかった Lisper のために、Lisp のコードで停止性を解説してみる。使用する Lisp としては、Scheme、Common Lisp、Emacs Lisp を検討したが、Emacs Lisp が一番よいと分かったので、Emacs Lisp を使う。 名前を使った概…

Living in the open world(2)

以下は Alice が定義: {-# LANGUAGE TypeSynonymInstances #-} module A where type StackA = [] top :: StackA a -> a top = head pop :: StackA a -> StackA a pop = tail push :: a -> StackA a -> StackA a push = (:) move :: StackA a -> c a -> (a -…

Living in the open world

{-# LANGUAGE TypeSynonymInstances #-} -- 以下は Alice が定義 type StackA = [] topA :: StackA a -> a topA = head popA :: StackA a -> StackA a popA = tail pushA :: a -> StackA a -> StackA a pushA = (:) -- 以下は Bob が定義 data StackB a = Ni…

Haskell演習の草稿

プログラミングの経験はあるが、Haskell は使ったことがない人に、2時間ぐらいで Haskell のよさを教える演習のネタを考える。Haskell の代表的な利点といえば、 型による厳密なプログラミング QuickCheck によるテストケースの自動生成 Persec によるパーサ…

HIMA' のための Git 資料

用意すべきもの: git パケージ名は git-core かも ビジュアライザー BSD/Linux なら gitk、Mac なら GitX github のアカウント 今回は、自分で git サーバーを上げることはしません 環境設定 git config --global user.name "名前" git config --global use…

祝 「Scheme 手習い」復刻

めでたい! 「Scheme 手習い」が復刻しました。正確に言うと、復刻ではなく、新しい版に基づいた新しい訳です。Scheme手習い作者: Daniel P. Friedman,Matthias Felleisen,元吉文男,横山晶一出版社/メーカー: オーム社発売日: 2010/10/22メディア: 単行本(…

図解Git

Visual Git Reference を訳しました。その名も図解Gitです。著者の Mark Lodato さんに連絡したら、github で fork して訳を公開して下さいと言われたのでそうしたら、本家にマージされて、右上に言語メニューまで付きました。:) Git や github は、使ってい…

/dev/random の秘密

たとえば SSH や PGP の鍵対を生成するときには、本当の乱数が必要になる。疑似乱数ではダメだ。Unix 上で乱数を生成してくれるデバイスとしては、/dev/ramdom がある。/dev/ramdom には、真性乱数が蓄えられていて、read システムコールで必要なバイト数だ…

疑似乱数に状態なんていらない

State モナドと疑似乱数で書いたように、遅延評価が利用できる言語では、無限数列が扱えるので、疑似乱数を使う際に状態を持たなくてもよい。その一例として、モンテカルロ法による円周率の近似を挙げてみる。XY 平面に単位円を考える。 radius :: Double ra…

Haskellで正規表現リテラル

Haskell で正規表現を使いたくなったとします。Haskell には正規表現のリテラルがないので、文字列リテラルで代用します。Haskell の正規表現では、メタ文字の多くがバックスラッシュを使わずに定義されています。そこで、文字列中にバックスラッシュを書く…

Maybe モナドの秘密

Real World Haskell 読書会での Maybe モナドに関する議論をまとめておきます。 case と Maybe モナドの導入には、必ずといっていいほど、Maybe が使われます。たとえば、子供をキーとして検索すると、父親を得られる DB があるとします。 type DB = [(Strin…

関数合成の妙技

Haskell 初心者は括弧ばかりの Lisp のようなコードを書く。中級者になると、($) が多くなる。上級者(言い過ぎか?)になると、($) が消えて、(.) が多くなる。この記事では、上級者になるコツをちょっと教えちゃおう。 括弧だらけのコード では、以下の例に…

Receiver Policy Framework バージョン 0.2 のリリース

SenderID/SPF に加えて、DomainKeys/DKIM を実装した RPF をリリースしました。 背景 メールアドレスの詐称を判断できるようするドメイン認証には、IP ベースと署名ベースの2種類があり、それぞれに長所短所があります。 IP ベース Sender ID/SPF 転送に弱い…