При попытке отладить проблему в моей программе (с помощью Gloss *
рисуется 2 круга с одинаковым радиусом), я наткнулся на странную ситуацию. В моем файле, который обрабатывает объекты, у меня есть следующее определение для Player
:
type Coord = (Float,Float)
data Obj = Player { oPos :: Coord, oDims :: Coord }
и в моем главном файле, который импортирует Objects.hs, у меня есть следующее определение:
startPlayer :: Obj
startPlayer = Player (0,0) 10
Это произошло из-за того, что я добавил и изменил поля для игрока и забыл обновить startPlayer
после (его размеры были определены одним числом для представления радиуса, но я изменил его на Coord
для представления (ширина, высота); если я когда-либо сделаю объект игрока не круглым).
Удивительно то, что приведенный выше код компилируется и запускается, несмотря на то, что второе поле имеет неправильный тип.
Сначала я подумал, что, возможно, у меня были открыты разные версии файлов, но любые изменения любых файлов были отражены в скомпилированной программе.
Затем я подумал, что, может быть, startPlayer
не использовался по какой-то причине. Комментирование startPlayer
приводит к ошибке компилятора, и, что еще более странно, изменение 10
в startPlayer
вызывает соответствующий ответ (изменяет начальный размер Player
); опять же, несмотря на то, что это не тот тип. Чтобы убедиться, что он правильно читает определение данных, я вставил опечатку в файл, и он выдал ошибку; поэтому я смотрю на правильный файл.
Я попытался вставить 2 вышеупомянутых фрагмента в их собственный файл, и он выдал ожидаемую ошибку, что второе поле Player
в startPlayer
неверно.
Что может позволить этому случиться? Вы можете подумать, что это именно то, что должно предотвращать средство проверки типов в Haskell.
*
Ответом на мою первоначальную проблему, когда два круга предположительно равного радиуса были нарисованы с разными размерами, было то, что один из радиусов был фактически отрицательным.