Хаскелл структуры данных странность - PullRequest
4 голосов
/ 25 мая 2011

Я пытался написать небольшой файл, чтобы опробовать структуру данных, похожую на сумку. Пока мой код выглядит следующим образом:

data Fruit = Apple | Banana | Pear deriving (Eq, Show)
data Bag a = EmptyBag | Contents [(a, Integer)]

emptyBag :: Bag a
emptyBag = EmptyBag

unwrap :: [a] -> a
unwrap [x] = x

isObject theObject (obj, inte) = theObject == obj

count :: Bag a -> a -> Integer
count (Contents [xs]) theObject = snd (unwrap (filter (isObject theObject) [xs]))
count EmptyBag _ = 0

Но когда я пытаюсь запустить его, я получаю сообщение об ошибке Не удалось вывести (уравнение) из контекста () в результате использования isObject в ....

Принимая во внимание, когда я беру функцию подсчета и вызываю snd (unwrap (filter (isObject Banana) [(Apple, 1), (Banana, 2)])) оно счастливо возвращается 2.

Любые подсказки о том, почему это так, или советы по написанию такого рода структуры данных будут очень благодарны.

1 Ответ

6 голосов
/ 25 мая 2011

(==) может использоваться только в контексте, который включает Eq, но когда вы объявили count, вы не включили этот контекст.Если я правильно читаю, это будет

count :: Eq a => Bag a -> a -> Integer

Если вы объявите count без включения типа, вы можете запросить ghci для предполагаемого типа;или просто спросите предполагаемый тип snd (unwrap (filter (isObject Banana) [(Apple,1),(Banana,2)]))

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