2011-09-01から1ヶ月間の記事一覧

リストの畳み込みと展開

リストの畳み込みには、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 では軽量なユーザスレッドを提供することに成功しています。僕は、この違いが何から生じているのか理解したいと思っています。こ…