Решение уравнений в Хаскеле - PullRequest
4 голосов
/ 29 августа 2011

Мне нужно сделать упражнение, и я довольно растерялся ... Мне нужно сделать экземпляр для Орд с полиномами. Это моя попытка:

data Pol = P [(Float,Int)] deriving Show

instance Ord Pol where
  (Pol a) > (Pol b)  = (maxGrado a) > (maxGrado b) || ((maxGrado a) == (maxGrado b) && (maxCoe a) > (maxCoe b))
  (Pol a) < (Pol b)  = (maxGrado a) < (maxGrado b) || ((maxGrado a) == (maxGrado b) && (maxCoe a) < (maxCoe b))

maxGrado :: [(Float,Int)] -> Int
maxGrado [] = 0
maxGrado ((c,g):xs) = g  

maxCoe :: [(Float,Int)] -> Int
maxCoe [] = 0
maxcoe ((c,g):xs) = c

- ошибка:

ERROR file:.\Febrero 2011.hs:32 - Undefined data constructor "Pol"

Ошибка очень глупая, но час пытался ее решить ... Может ли кто-нибудь мне помочь?

Спасибо !!

Ответы [ 2 ]

9 голосов
/ 29 августа 2011
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)]

Это также будет работать.

3 голосов
/ 29 августа 2011

Я думаю, что вы хотите использовать P вместо Pol в функциях вашего экземпляра.Pol - это тип, P - конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...