Я хочу сделать ритмы с печатью Haskell's. Следующее должно произвести повторяющийся ритм, в котором одна нота в два раза длиннее двух других. (Этот ритм кодируется в списке [1,1,2].)Неточность синхронизации в Haskell threadDelay
import Control.Concurrent
import Text.Printf
import Control.Monad
main = mapM_ note (cycle [1,1,2])
beat = round (10^6/4) -- measured in miliseconds
note :: Int -> IO()
note n = do
threadDelay $ beat * n
printf "\BEL\n"
Когда я запускаю это длинная нота звучит примерно в три раза дольше, как другие, а не в два раза. Если я ускорю его, изменив число 4 на 10, ритм полностью разрушится: все ноты имеют одинаковую длину.
Есть ли частота обновления для изменения? Является ли threadDelay не службой для использования, если я хочу точное время?
О системах, с которыми я знаком, выводя BEL-блоки на мгновение до того, как программа продолжится, что испортит вашу математику. – luqui
@luqui: И в Windows он не блокируется, что испортится с вашими ушами: /. – Zeta
Почему вы используете 'printf' вместо' print'? –