haskell: создание списка записей - PullRequest
3 голосов
/ 20 октября 2011

Как создать список записей в haskell

У меня есть запись

data TestList = Temp1 (String,[String])
          | Temp2 (String,[(String,String)])
    deriving (Show, Eq)

Я создаю список записей

testLists :: [TestList]
testLists =  [minBound..maxBound]

Когда я бегу, мне выдается ошибка.

No instance for (Enum TestList)
      arising from the arithmetic sequence `minBound .. maxBound'
    Possible fix: add an instance declaration for (Enum TestList)
    In the expression: [minBound .. maxBound]
    In an equation for `testLists': testLists = [minBound .. maxBound]

Это дает мне возможное решение, но я не понимаю, что это значит. Может кто-нибудь объяснить это и сказать мне, как это исправить.

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

Нельзя использовать minBound и maxBound, если вы заранее не заявите, что они означают для вашего типа (что, кстати, не является типом записи ).Вы, как и в сообщении об ошибке, должны объявить тип как instance из Bounded.Без знания того, что представляет собой ваш тип, невозможно сказать, как именно должна выглядеть такая декларация, но ее общая форма:

instance Bounded TestList where
  minBound = ...
  maxBound = ...

(заполните ...)

2 голосов
/ 20 октября 2011

Вы не сказали ему, как перечислять значения типа TestList.Даже если он понимает, что такое minBound и maxBound, он не знает, как определить, что все значения между ними (чтобы создать список с этими значениями).

Путем добавленияобъявление экземпляра для Enum TestList, вы в основном будете указывать ему, как перечислять значения, чтобы можно было создать эту последовательность для вас.

1 голос
/ 20 октября 2011

Здесь есть две проблемы. Во-первых, вам нужно создать экземпляр Enum (как уже говорили другие). Требуется экземпляр Enum, поскольку вы использовали специальный синтаксис перечисления [ a .. b].

После того, как вы создали экземпляр Enum, вам также нужно написать экземпляр для Bounded, потому что вы использовали minBound и maxBound.

Обычно вы можете указать компиляторам Haskell получить оба этих экземпляра, однако это не сработает, поскольку ни в Lists, ни в Strings не существует экземпляров для любого типа. Какое значение должно иметь maxBound :: String? Вы всегда можете сделать более длинную строку или добавить другой элемент в список. Поскольку вы не можете получить экземпляры, вам придется вручную написать экземпляр Enum, как в ответе larsmans, и аналогичным образом экземпляр Bounded.

...