data Pol = P [(Int, Int)]
В этом объявлении Pol
является конструктором типа, а P
является единственным конструктором данных для этого типа данных.В общем, тип данных может иметь несколько конструкторов данных, поэтому у нас есть это различие.
Простое правило состоит в том, что вы должны использовать конструктор типов всякий раз, когда вы говорите о типах, и конструктор данных, когда вы говорите о значениях.
В этом случае вам следует использоватьPol
в заголовке экземпляра, но P
в шаблонах для ваших функций.
instance Ord Pol where
(P a) > (P b) = ...
(P a) < (P b) = ...
Также обратите внимание, что конструкторы типов и конструкторы данных живут в разных пространствах имен и никогда не используются в одном контексте.Это означает, что они могут иметь одинаковое имя.
data Pol = Pol [(Int, Int)]
Это также будет работать.