Это не так.Вы сталкиваетесь с тенденцией проверки типов объединяться настолько, насколько это возможно, прежде чем сообщать об ошибке.В этом случае средство проверки типов думает: «О, это выражение имеет тип m something
, и я хочу V2 something
. Поэтому m
должно быть V2
».Он откладывает до последующей проверки, что m = V2
удовлетворяет этому ограничению MonadIO
.И прежде чем попасть туда, он заглядывает внутрь типа верхнего уровня и понимает, что он не может объединить V2 CInt
с CInt
, поэтому он не может до проверки, является ли V2
монадой.
Как человек, вы можете отреагировать на свою ошибку, сделав резервную копию и спросив, какое из ваших предположений было неверным.Проверка типов не делает этого вообще.Вместо этого он предполагает, что все его предположения были в порядке вплоть до того момента, когда было невозможно продолжить.Тогда он жалуется на самый последний шаг.Довольно часто к тому времени он проходил по какой-то странной кроличьей норе, поэтому ошибки типов на Хаскеле, как известно, очень плохие, особенно когда здесь задействованы классы типов, как здесь.
Теперь вот настоящая ошибка,Вам необходимо вычислить измерения в монаде IO
(или в другом экземпляре MonadIO
).Это означает, что вам нужно сделать:
surfDim <- SDL.surfaceDimensions surfIn
в некотором соответствующем блоке do
.Вы не можете сделать это просто обычным уравнением.