あどけない話

Internet technologies

2011-01-01から1年間の記事一覧

Haskellのリスト定義の謎

ghci を起動し、":info []" とタイプすれば、リストの定義が表示されます。 > :info [] data [] a = [] | a : [a] これが何を意味しているのか、僕は長い間分かりませんでした。同じように悩んでいる人もいるかもしれないので、説明してみます。まず、第一の…

Haskellの講義に関するQ&A

岡山大学で、関数プログラミングの講義を一コマ担当しました。資料は、函数プログラミングの集いで使った関数プログラミングの道しるべを流用しました。ちゃんと用意しなくて、講義を受けた学生には申し訳ないです。講義内容に関して質問を頂きました。同じ…

書評:Scala スケーラブルプログラミング 第2版

Scala の作者である Odersky らが書いた「Scala スケーラブルプログラミング」の第2版が出版されました。Scalaスケーラブルプログラミング第2版作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘出版社/メーカー: インプレス発売日…

永続二色木

Purely Functional Data Structures の勉強会で説明した二色木(Red-black tree)に関するメモ。Purely Functional Data Structures作者: Chris Okasaki出版社/メーカー: Cambridge University Press発売日: 1999/07/01メディア: ペーパーバック購入: 5人 クリ…

リストの畳み込みと展開

リストの畳み込みには、foldr が使われる。 foldr :: (a -> b -> b) -> b -> [a] -> b foldr _ ini [] = ini foldr op ini (x:xs) = x `op` foldr op ini xs Data.List には、この双対となる関数 unfoldr が定義してある。 unfoldr :: (a -> Maybe (b,a)) ->…

右も左も分かる再帰

「函数プログラミングの集い」のチュートリアル資料を作成するためのメモ。リストに対する再帰を2つに分類することで理解する。 再帰 関数プログラミングでは、繰り返しを再帰で実現する。入力がリストである関数を実装するとする。この種の関数は、出力の種…

(続)Haskell(GHC)での軽量ユーザスレッドの実装方法

Haskell(GHC)での軽量ユーザスレッドの実装方法で、Cmm が軽量スレッドのポイントと書きました。しかし、GHC の実装者 Simon Marlow 先生から「Cmm は関係ないよ」と教えて頂きました。 StgCall StgCall がいくつかのレジスタを保存するのは、採用しているC…

カリー化談義

最近、スタートHaskellで「カリー化された関数のメリットは何か?」という質問が出た。そのすぐ後に、kmizuさんがカリー化の誤用に対して警鐘を鳴らしてしていた。僕からするとkmizuさんの「カリー化の定義」も誤用に思えたので、調べるとともに考えたことの…

Haskell(GHC)での軽量ユーザスレッドの実装方法

命令型言語の Java や Ruby がユーザスレッドからカーネルスレッドに移行したのとは対照的に、関数型言語の Erlang や Haskell では軽量なユーザスレッドを提供することに成功しています。僕は、この違いが何から生じているのか理解したいと思っています。こ…

Haskellの文法(再帰編)

構造化定理によれば、分岐、反復、逐次があれば、すべてのロジックは記述できます。分岐については、Haskellの文法(分岐編)で説明しました。今日は反復について説明します。逐次に関しては、少し難しい内容ですが、QAで学ぶMonadを読んで下さい。 for 文 多…

Haskellの文法(分岐編)

僕が Haskell を学び始めた頃、Haskell の文法はすんなりとは頭に入ってきませんでした。もともと僕はプログラミング言語の学習能力が低いので、僕だけかもしれませんが、「はじめからこう言ってもらえれば分かったのにぃ」ということを書きます。 はじめの…

Haskell から見た node.js

誤訳 以前、「サーバサイドJavaScriptのNode.js、最初はCやHaskellを検討し失敗。開発者ライアン・ダール氏へのインタビュー」という記事が twitter で話題になっていました。 ―― なぜJavaScriptを選んだのでしょう?ダール氏 実は最初は違いました。最初はC…

HaskellとDSL

LL Planets の「メタプログラミングの光と闇」で Haskell について話してきました。Perl、Python、Ruby が概ね内部 DSL を作る話だったのに対し、Haskell では外部DSLを内部に埋め込むという話をしました。短い時間で説明不足になった感があるので、この記事…

FreeBSD に Haskell Platform をインストールする方法

FreeBSD の ports の GHC は 6.10.4 でがっかりするので、自分で GHC 7.0.3 を入れる。GHC 7.0.3 の FreeBSD 用バイナリはあるけど、Haskell Platform のバイナリはないので、結局手で入れる。/usr/local/ghc7.0.3 に入れるとする。まずこのディレクトリを作…

書評「Coders at Work」

「Coders at Work」は、15人の有名プログラマーに対するインタビューをまとめた本だ。私は5人のインタービューを読んだ時点でこの記事を書いている。Coders at Work プログラミングの技をめぐる探求作者: Peter Seibel,青木靖出版社/メーカー: オーム社発売…

Haskellの開発ツール (2011年版)

Haskell開発に関係するツールをとりとめもなく列挙してみます。 エディタ/IDE 僕は、Emacs と haskell-mode と ghc-mod を組み合わせて使っています。haskell-mode は、行頭揃えの機能がしょぼいので、作り直したいと思っています。IDE のバックエンドとして…

Haskellライブラリ入門 (2011年版)

この記事では、基本ライブラリである Prelude の関数をだいたい理解した人が、次に知るべきライブラリを紹介します。自由自在にリストを使いこなせ、正規表現がなくてもプログラミングができるんだなと実感した人を対象にしています。この記事のテーマは、脱…

2011年に Haskell を始める人のために

適切な一歩を踏み出すか否かは、大きな違いを生みます。この記事では、2011年に Haskell を始める人のために、著者が考える最適な入門方法を示します。 Haskell Platform をインストールする 昔人気のあった Hugs は、もう保守されていません。現在は、GHC …

Haskell でスリープソート

Haskeller から見れば、標準出力に表示なんてダサい。orz import Control.Concurrent sleepSort :: [Int] -> IO () sleepSort = mapM_ (forkIO . sleepy) where sleepy n = threadDelay (n * 1000) >> print n

ファーストクラスIOと部品プログラミング

Haskell 界隈では、生産者/消費者のモデルとして、Enumerator/Iteratee (EI)が流行っている。しかし、EI を理解するのは難しい。そこでこの記事では、もっと簡単な生産者/消費者モデルを示す。EI は Enumerator が Iteratee に push する push 型だが、紹介…

不動点の話

不動点コンビネータを使うと、どうして無名関数で再帰ができるのかを考えてみる。 名前を取り去る 以下の階乗を計算する関数 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' | '…