Я в значительной степени понимаю 3/4 остальную часть языка, но каждый раз, когда я опускаю ноги в использование классов значимым образом в своем коде, я становлюсь надолго укорененным.
Почему этот чрезвычайно простой код не работает?
data Room n = Room n n deriving Show
class HasArea a where
width :: (Num n) => a -> n
instance (Num n) => HasArea (Room n) where
width (Room w h) = w
Таким образом, ширина комнаты обозначается ints или, возможно, float, я не хочу ограничивать ее в этот момент. И класс, и экземпляр ограничивают n тип Nums, но он все еще не нравится, и я получаю эту ошибку:
Couldn't match expected type `n1' against inferred type `n'
`n1' is a rigid type variable bound by
the type signature for `width' at Dungeon.hs:11:16
`n' is a rigid type variable bound by
the instance declaration at Dungeon.hs:13:14
In the expression: w
In the definition of `width': width (Room w h) = w
In the instance declaration for `HasArea (Room n)'
Итак, он говорит мне, что типы не совпадают, но он не говорит мне, какие типы он считает, что это действительно полезно. Как замечание, есть ли простой способ отладить ошибку, подобную этой? Единственный способ, которым я это знаю, - случайное изменение материала, пока оно не сработает.