如何在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]
它给了我一个可能的修复,但我不明白它意味着什么。任何人都可以解释它并告诉我如何解决它。
答案 0 :(得分:3)
您不能使用minBound
和maxBound
,除非您事先声明它们对您的类型的意义(顺便说一下,它不是record type)。正如错误也告诉您的那样,您必须将类型声明为instance
Bounded
。如果不知道你的类型代表什么,就不可能说出这样的声明应该是什么样的,但它的一般形式是
instance Bounded TestList where
minBound = ...
maxBound = ...
(填写...
)
答案 1 :(得分:2)
您没有告诉它如何枚举TestList
类型的值。即使它理解minBound
和maxBound
是什么,它也不知道如何发现它们之间的所有值(为了创建具有这些值的列表)。
通过为Enum TestList
添加实例声明,您基本上会指导它如何枚举值,因此它可以为您构造该序列。
答案 2 :(得分:1)
这里有两个问题。首先,您需要创建一个Enum
实例(正如其他人所说)。由于您使用了特殊的枚举语法Enum
,因此需要[ a .. b]
个实例。
创建Enum
实例后,您还需要为Bounded
编写实例,因为您已使用minBound
和maxBound
。
通常你可以告诉Haskell编译器派生这两个实例,但是这在这里不起作用,因为Lists和Strings都没有任何类型类的实例。无论如何,maxBound :: String
应该有什么价值?您总是可以创建一个更长的字符串,或者将另一个元素添加到列表中。由于您无法派生实例,因此您必须手动编写Enum
实例,如larsmans answer和类似Bounded
实例。