3

如何在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]

它给了我一个可能的解决方法,但我不明白这意味着什么。谁能解释它并告诉我如何解决它。

4

3 回答 3

3

你不能使用minBoundandmaxBound除非你事先声明它们对你的类型意味着什么(顺便说一句,它不是记录类型)。正如错误还告诉您的那样,您必须将类型声明为instanceof Bounded。如果不知道你的类型要表示什么,就不可能准确地说出这样的声明应该是什么样子,但它的一般形式是

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

(填写...

于 2011-10-20T17:50:33.657 回答
2

您没有告诉它如何枚举 type 的值TestList。即使它了解什么minBoundmaxBound是什么,它也不知道如何发现介于两者之间的所有值是什么(以便创建包含这些值的列表)。

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

于 2011-10-20T17:51:51.367 回答
1

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

创建Enum实例后,您还需要为实例编写一个实例,Bounded因为您使用过minBoundand maxBound

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

于 2011-10-20T18:12:05.743 回答