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 も一応読み終わったし、似たようなタイトルということで『位相と論理 (日評数学選書)(田中 俊一)』に手を出してみる。 今日は、第一章「順序と束」を読んだ。環論についてよく知らなかったので、ブール代数のイデアルとブール環のイデアルの対応を丁寧に追っていたら、思ったよりも手間取ってしまった。
[ツッコミを入れる]
