Проблема в том, что вы всегда вращаетесь на 30 градусов, каждая итерация: ctx.rotate(30 * Math.PI / 180)
.
Что вам действительно нужно сделать, так это отслеживать, какую итерацию метода setInterval()
вы используете (т.е. сколько раз он был вызван), так что вы можете умножить это на количество градусов, которое вы хочу вращаться.
Другими словами, вы всегда вращаетесь на 30 градусов, но вы хотите, чтобы сделал это поворот на 30 градусов раз количество итераций, которые вы уже выполнили.
Хороший способ отладить код Haskell состоит в том, чтобы записать и протестировать алгебраическое использование законов QuickCheck и SmallCheck. Было несколько отладчиков Haskell включая Шляпу, Капюшон и Freya, но ни одного из них, как не воспринимали, как достаточно ценный стоило поддержать в течение долгого времени.
Когда это - Haskell, необходимо думать по-другому о том, как сделать вещи. Бумага ICFP на странице QuickCheck имеет некоторые хорошие примеры для запущения Вас. Если Вы хотите реальный пример xmonad
экстенсивно отлажен с помощью QuickCheck.
Как примечание стороны, знать это Debug.trace
НЕ будет Ваш друг при отладке многопоточных программ.
Тестирование является способом пойти в длительный период.
Да, frontend для отладчика GHCi был бы хорошей вещью. Возможно, мы сделаем что-то во время следующего Хакатона. Однако тем временем:
С другой стороны, Haskell предоставляет себя приятно использованию восходящего тестирования QuickCheck. Т.е. протестируйте свои компоненты индивидуально, затем соедините их. Если Ваш код чист это часто Просто Работы.
В моих собственных целях я нахожу, что это - комбинация факторов.
Как замечено в других ответах, много людей любит QuickCheck. Я нашел, что это трудный определить значимые тестовые сценарии QuickCheck для по крайней мере части моего кода так обычно больше использует стандартные модульные тесты. Однако существует превосходное введение в использование QuickCheck в Главе 11 Реального мира Haskell.
Если Вы используете и QuickCheck и HUnit, можно хотеть изучить среду тестирования.