2007-06-08 [長年日記]
λ. サンタクロース問題
最近、コードを全然書いていなかったのでリハビリのつもりでやってみた。 とりあえず、Concurrent Haskell + STM で安直に。 出力はかなり手を抜いていて、複数のスレッドの出力が混ざったりと散々w
module Main where import Control.Monad import Control.Concurrent import Control.Concurrent.STM import System.Random import System.IO main :: IO () main = do hSetBuffering stdout LineBuffering reindeerCh <- newTChanIO elfCh <- newTChanIO mapM_ (forkA reindeerCh) ["Reindeer("++show n++")" | n <- [1..9]] mapM_ (forkA elfCh) ["Elf("++[c]++")" | c <- ['A'..'J']] forkIO $ sequence_ $ repeat $ join $ atomically $ msum $ [ do xs <- readN 9 reindeerCh return $ do putStrLn "Santa Claus goes with reindeers." randomWait mapM_ (flip putMVar ()) xs , do xs <- readN 3 elfCh return $ do putStrLn "Santa Claus solves elve's problem." randomWait mapM_ (flip putMVar ()) xs ] getChar return () forkA :: TChan (MVar ()) -> String -> IO ThreadId forkA ch s = do v <- newEmptyMVar forkIO $ sequence_ $ repeat $ do randomWait putStrLn (s ++ " comes.") atomically $ writeTChan ch v takeMVar v putStrLn (s ++ " goes away.") randomWait :: IO () randomWait = randomRIO (500000, 2000000) >>= threadDelay readN :: Int -> TChan a -> STM [a] readN n = sequence . replicate n . readTChan
【追記】 らくがきえんじん(2007-06-09) でsyd_sydさんがこのコードについて解説してくださっているので、こちらもどうぞ。
λ. 『位相と論理』
先日 Topology via Logic も一応読み終わったし、似たようなタイトルということで『位相と論理 (日評数学選書)(田中 俊一)』に手を出してみる。 今日は、第一章「順序と束」を読んだ。環論についてよく知らなかったので、ブール代数のイデアルとブール環のイデアルの対応を丁寧に追っていたら、思ったよりも手間取ってしまった。