トップ «前の日記(2007-06-07) 最新 次の日記(2007-06-09)» 月表示 編集

日々の流転


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さんがこのコードについて解説してくださっているので、こちらもどうぞ。

Tags: haskell

λ. 『位相と論理』

先日 Topology via Logic も一応読み終わったし、似たようなタイトルということで『位相と論理 (日評数学選書)(田中 俊一)』に手を出してみる。 今日は、第一章「順序と束」を読んだ。環論についてよく知らなかったので、ブール代数のイデアルとブール環のイデアルの対応を丁寧に追っていたら、思ったよりも手間取ってしまった。

Tags: