Basic Category Theory for Computer Scientists

薄いわりにはなかなか読み進めることができないのは、数学的な素養が足りないからか。とhakellの型情報と突き合わせながら読んでいるが、何度も読みなおす本になりそう。

ProductName Basic Category Theory for Computer Scientists (Foundations of Computing)
Benjamin C. Pierce
The MIT Press / 2164円 ( 1991-08-07 )


わからないところがあれば検索して周辺情報を探しながら読んでるが、自分自身を出力するプログラムの後半のFunctorの説明がわかりやすかった。定義5もしっくりきた。T2 -> Tのμってjoin(concat)のことか。

他にはThe Typeclassopediaを読みなおしてみたけど、発見が色々あって得るものが多かった。これも何度か読みなおすことになりそう。

他に関数型プログラマのためのモナド理論ってのも読んだけど、これはちと難しかった。圏論の本を読んでおくべきなのだろうけど日本語の本でヨサゲなのはないだろうか。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan
オライリージャパン / 3990円 ( 2009-10-26 )


ネットワーク関連の本を読んでみることにした

最近ちょっとヤル気がおきないので、別のことでもしようとネットワーク関連の本でも読んでみることにした。

ProductName UNIXネットワークプログラミング入門
雪田 修一
技術評論社 / ?円 ( 2003-06-05 )


ProductName ルーター自作でわかるパケットの流れ
小俣 光之
技術評論社 / 1974円 ( 2011-07-09 )


そういえばRWHにもSocket通信の章があったので後で読みなおしてみるか。

ProductName Real World Haskell
Bryan O'Sullivan
Oreilly & Associates Inc / 4058円 ( 2008-12-05 )


JavaCCでパーサを作ってみる

ふつうのコンパイラをつくろうを読み始めた。

JavaCCを使ったAdderの写経。

The Java Parser Generator

options {
    STATIC = false;
}

PARSER_BEGIN(Adder)
import java.io.*;

class Adder {
    static public void main(String[] args) {
        for (String arg: args) {
            try {
            System.out.println(evaluate(arg));
            }
            catch (ParseException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }
    static public long evaluate(String src) throws ParseException {
         Reader reader = new StringReader(src);
         return new Adder(reader).expr();
    }
}
PARSER_END(Adder)

SKIP: { <[" ","\t","\r","\n"]> }

TOKEN: {
    <INTEGER: (["0"-"9"])+>
}

long expr():
{
    Token x, y;
}
{
    x=<INTEGER> "+" y=<INTEGER> <EOF>
        {
            return Long.parseLong(x.image) + Long.parseLong(y.image);
        }
}

イマイチよくわからないのは慣れてないせいか?パーサだったらRWHのParsecが楽しかった。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan
オライリージャパン / 3990円 ( 2009-10-26 )


Scalaも調べたらスライド見つけた。あとで試してみようっと。

最後のHaskell読書会に参加した

最終章。この章自体はさらっとしていて、どこにつながっていくのかいまいちよくわからなかったのだけど、最後にLTっぽい感じで部分評価の話が出てきてたのでソッチの方に関係していく話題だったのかな?と思った。LLVMとかPyPyの方向?あとでちゃんと追いかけてみようかな。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ( 2009-11-11 )


@yoshinabuのイタリア土産。と思いきやフランス?

1292703303

さて、次回からはJGP(JavaScript: The Good Parts)を読んでいくことになった。HTML5のおもしろそうな機能はjavascriptいるよね?みたいな流れで、半年くらいでこれ読んだら、他の本(WebSocketとか面白そう)に行くのか、派生的に別れていくのかな。

ProductName JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
Douglas Crockford
オライリージャパン / ¥ 1,890 ( 2008-12-22 )


第一回目は2/12(sat)@富士の予定。そのうち案内が出ると思いますが、興味があれば参加するとよいと思います。


他には入門自然言語処理とかも候補に上がっていたが、いまいち雰囲気を勝ち取れそうになかった。少し前からプッシュしていかないとなかなか難しいですね(twitterでもいいと思うけど)。もう少し動機付けが必要かな?

で、もし入門自然言語処理を選択するなら、ゴールを「twitterボットをつくってみる」とかそんな感じにしておけば雰囲気的に向かう方向がはっきりするのかなぁと思った。「本書を通してPythonを学ぶ」でもいいのかもしれないけど。

ProductName 入門 自然言語処理
Steven Bird
オライリージャパン / ¥ 3,990 ( 2010-11-11 )


その流れで恋するRubyの話とか

ProductName 恋するプログラム―Rubyでつくる人工無脳
秋山 智俊
毎日コミュニケーションズ / ¥ 2,625 ( 2005-04 )


個人的にはこっち方面も好きなのでこういう勉強会が流れるのも嬉しいが。

明日は最後のHaskell読書会

前回はいけなかったけど、それ以外は全て参加した。この読書会で得るものは多かったように思う。

第12回Haskell読書会開催のお知らせ

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ( 2009-11-11 )
在庫あり。

読書会だけだと受身色が強くなりがちなので、今後はもっと成果を出していくような方向も模索していきたいところ。

関数プログラミングの楽しみ(関数画像)

第7章の関数画像のところで、Panが面白そうなので触ってみようと、サイトを見てみたらWindows用だった

ProductName 関数プログラミングの楽しみ

オーム社 / ¥ 4,410 ()
在庫あり。

おりがみプログラミング 3.14

apoL'を使ってinsertを定義する

-- 3.14

apoL' :: (b -> Maybe (a, Either b (List a))) -> b -> List a
apoL' f u = case f u of
              Nothing            -> Nil
              Just (x, Left v)   -> Cons x (apoL' f v)
              Just (x, Right xs) -> Cons x xs

insert3 = apoL' step u
    where 
      step Nil = Nothing
      step (Cons x xs) = if x < u then Just (x, Left xs) else Just (x, Right xs)

とやると

Not in scope: `u'

と言われるが理由がわからん。

ProductName 関数プログラミングの楽しみ

オーム社 / ¥ 4,410 ()
在庫あり。

疲れたので、今日はもう読むのをやめよう。

第10回静岡Haskell読書会

先週末の読書会。切符遊びの章。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ()
在庫あり。

団子うまかった。

1288005978

懇親会はセルフ串揚げの店。マジセルフ。ネタケースから串を持ってきて、衣つけて揚げる。

1288005975

なんていうか、この地域の居酒屋の名前を借りるなら、串電車でGoみたいなセルフ感満載だった。

来月、京都行きとかぶってるじゃんということにさっき気づいた。というわけで次回は初の欠席になりますな。

Real World Haskell 26章

ブルームフィルター

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

3,4日かけて一応buildまではしたが、テストとか動かしてない。いまいち理解も追いついてなかったのが心残りだが、一通り読み終わったのでよしとしよう。それにしてもこの本はPerl的には「続・はじめてのPerl」くらいのレベル?「実用 Perlプログラミング 第2版」ではないでしょうなぁと。

みなさんこの先どうやって進んでいくんだろう?超気になるところ。

一周目は15章以降がほとんど理解できなかったけど、今回読んだら結構理解できたのでよかった。

1288005286

プログラミングHaskell読書会にでて、問題もきちんと解いたってのも良かったのかも。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ()
在庫あり。

美しきかな、並列

Real World HakellのSTMの章がなんか消化不良だったのでなんかないかなぁと探したら、ビューティフルコードにSTMの章があったのを思い出したので、早速読んだ。

ちなみに英語のはここ

サンタクロース問題わかりやすい。ついでに動かしてみたけどControl.Monadもインポートしないと動かない@GHC6.12.3

module Main where
import Control.Concurrent.STM
import Control.Concurrent
import Control.Monad
import System.Random

meetInStudy :: Int -> IO ()
meetInStudy id = putStr ("Elf " ++ show id ++ " meeting in the study\n")

deliverToys :: Int -> IO ()
deliverToys id = putStr ("Reindeer " ++ show id ++ " delivering toys\n")

helper1 :: Group -> IO () -> IO ()
helper1 group do_task = do
  (in_gate, out_gate) <- joinGroup group
  passGate in_gate
  do_task
  passGate out_gate

elf1, reindeer1 :: Group -> Int -> IO ()
elf1      gp id = helper1 gp (meetInStudy id)
reindeer1 gp id = helper1 gp (deliverToys id)

data Gate = MkGate Int (TVar Int)

newGate :: Int -> STM Gate
newGate n = do { tv <- newTVar 0; return (MkGate n tv)}

passGate :: Gate -> IO ()
passGate (MkGate n tv) = atomically (do n_left <- readTVar tv
                                        check (n_left > 0)
                                        writeTVar tv (n_left-1))

operateGate :: Gate -> IO ()
operateGate (MkGate n tv) = do
  atomically (writeTVar tv n)
  atomically (do {n_left <- readTVar tv; check (n_left == 0)})


data Group = MkGroup Int (TVar (Int, Gate, Gate))

newGroup :: Int -> IO Group
newGroup n = atomically ( do g1 <- newGate n
                             g2 <- newGate n
                             tv <- newTVar (n, g1, g2)
                             return (MkGroup n tv))

joinGroup :: Group -> IO (Gate, Gate)
joinGroup (MkGroup n tv) 
    = atomically (do (n_left, g1, g2) <- readTVar tv
                     check (n_left > 0)
                     writeTVar tv (n_left-1, g1, g2)
                     return (g1,g2))

awaitGroup :: Group -> STM (Gate, Gate)
awaitGroup (MkGroup n tv)
    = do (n_left, g1, g2) <- readTVar tv
         check (n_left == 0)
         new_g1 <- newGate n; new_g2 <- newGate n
         writeTVar tv (n,new_g1,new_g2)
         return (g1, g2)

randomDelay :: IO ()
randomDelay = do
  waitTime <- getStdRandom (randomR (1, 1000000))
  threadDelay waitTime

elf :: Group -> Int -> IO ThreadId
elf gp id = forkIO (forever (do {elf1 gp id; randomDelay}))

reindeer :: Group -> Int -> IO ThreadId
reindeer gp id = forkIO (forever (do {reindeer1 gp id; randomDelay}))

santa :: Group -> Group -> IO ()
santa elf_gp rein_gp = do
  putStr "--------------------------\n"
  choose [(awaitGroup rein_gp, run "deliver toys"), (awaitGroup elf_gp, run "meet in my study")]
  where
    run :: String -> (Gate, Gate) -> IO ()
    run task (in_gate, out_gate) = do
                         putStr ("Ho! Ho! Ho! let's " ++ task ++ "\n")
                         operateGate in_gate
                         operateGate out_gate

choose :: [(STM a, a -> IO ())] -> IO ()
choose choices = do act <- atomically (foldr1 orElse actions)
                    act
    where 
      actions :: [STM (IO ())]
      actions = [do {val <- guard; return (rhs val)} | (guard, rhs) <- choices ]

main = do
  elf_group <- newGroup 3
  sequence_ [ elf elf_group n | n <- [1..10]]
  rein_group <- newGroup 9
  sequence_ [reindeer rein_group n | n <- [1..9]]
  forever (santa elf_group rein_group)

で、なんでputStrLn使わないのかなぁとか思いつつ、自分でputStrLn使って書いたコードを実行したら

--------------------------
Ho! Ho! Ho! let's deliver toys
Reindeer 4 delivering toys
Reindeer 6 delivering toysReindeer 5 delivering toysReindeer 7 delivering \
toysReindeer 2 delivering toysReindeer 3 delivering toysReindeer 9 \
delivering toysReindeer 8 delivering toysReindeer 1 delivering toys

みたいに文字が出力された後に改行がずらずら出力されることがある。

あー!と思ってソースを見たら

putStrLn        :: String -> IO ()
putStrLn s      =  do putStr s
                      putChar '\n'

という定義だった。というわけで、putStrじゃないといけない理由がわかった。

ProductName ビューティフルコード
Brian Kernighan,Jon Bentley,まつもとゆきひろ
オライリージャパン / ¥ 3,990 ()
在庫あり。