哲学者

無限ループなのになぜか終了してしまうという問題は、id:mzp に、最後の forkOS を消せばいいとアドバイスされて解決されました。サンクス。
うむ、たしかに親は子の終了を待たないってどっかに書いてあったな。なんで気がつかなかったんだろう。
あと Concurrent Haskell では、全てのスレッドが MVar を読もうとして止まると、それを検出してプロセスを止めてくれるようです。

% ./philo
"OK! (1)"
"OK! (1)"
"OK! (1)"
(略)
"OK! (3)"
"OK! (2)"
"OK! (1)"
"OK! (4)"
"OK! (3)"
"OK! (2)"
philo: thread blocked indefinitely

%