haskell:创建记录列表

时间:2011-10-20 17:46:18

标签: haskell winghci

如何在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 个答案:

答案 0 :(得分:3)

您不能使用minBoundmaxBound,除非您事先声明它们对您的类型的意义(顺便说一下,它不是record type)。正如错误也告诉您的那样,您必须将类型声明为instance Bounded。如果不知道你的类型代表什么,就不可能说出这样的声明应该是什么样的,但它的一般形式是

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

(填写...

答案 1 :(得分:2)

您没有告诉它如何枚举TestList类型的值。即使它理解minBoundmaxBound是什么,它也不知道如何发现它们之间的所有值(为了创建具有这些值的列表)。

通过为Enum TestList添加实例声明,您基本上会指导它如何枚举值,因此它可以为您构造该序列。

答案 2 :(得分:1)

这里有两个问题。首先,您需要创建一个Enum实例(正如其他人所说)。由于您使用了特殊的枚举语法Enum,因此需要[ a .. b]个实例。

创建Enum实例后,您还需要为Bounded编写实例,因为您已使用minBoundmaxBound

通常你可以告诉Haskell编译器派生这两个实例,但是这在这里不起作用,因为Lists和Strings都没有任何类型类的实例。无论如何,maxBound :: String应该有什么价值?您总是可以创建一个更长的字符串,或者将另一个元素添加到列表中。由于您无法派生实例,因此您必须手动编写Enum实例,如larsmans answer和类似Bounded实例。