haskell: создание списка записей

Как создать список записей в 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]

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


person veda    schedule 20.10.2011    source источник


Ответы (3)


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

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

(Введите ...)

person Fred Foo    schedule 20.10.2011
comment
Я понимаю проблему. Но одно дело в том, что это список размером от 0 до бесконечности. Итак, как я могу определить minBound и maxBound. - person veda; 20.10.2011
comment
@veda: вы не можете написать общий экземпляр, который имел бы смысл для всех случаев использования списка, однако вы можете написать экземпляр, который подходит для вашей проблемной области, предполагая, что вы заранее знаете верхнюю границу. - person John L; 20.10.2011
comment
@larsmans: я не согласен с вашими утверждениями. 1) существуют типы Enum, которые имеют бесконечное количество значений (например, Integer) 2) maxBound не имеет ничего общего с Enum (это часть Bounded) 3) Тем не менее, я все еще мог представить, что существует тип, который ограничен и все еще имеет бесконечное число значений в середине - person newacct; 21.10.2011
comment
Где я сказал Enum, я имел в виду Bounded. Извиняюсь. - person Fred Foo; 21.10.2011

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

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

person Zach    schedule 20.10.2011

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

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

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

person John L    schedule 20.10.2011