[英]haskell: creating list of records
如何在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]
它给了我一个可能的修复,但我不明白它的含义。 任何人都可以解释它并告诉我如何解决它。
您不能使用minBound
和maxBound
除非您事先声明它们对您的类型的意义(顺便说一下,它不是记录类型 )。 您必须,正如错误也告诉您的那样,将类型声明为Bounded
的instance
。 如果不知道你的类型代表什么,就不可能说这样的声明应该是什么样的,但它的一般形式是
instance Bounded TestList where
minBound = ...
maxBound = ...
(填写...
)
您没有告诉它如何枚举TestList
类型的值。 即使它理解minBound
和maxBound
是什么,它也不知道如何发现它们之间的所有值(为了创建具有这些值的列表)。
通过为Enum TestList
添加实例声明,您基本上可以指示它如何枚举值,因此它将能够为您构造该序列。
这里有两个问题。 首先,您需要创建一个Enum
实例(正如其他人所说)。 Enum
实例是必需的,因为您使用了特殊的枚举语法[ a .. b]
。
一旦你创建了Enum
实例,你还需要为Bounded
编写一个实例,因为你已经使用了minBound
和maxBound
。
通常你可以告诉Haskell编译器派生这两个实例,但是这在这里不起作用,因为Lists和Strings都没有任何类型类的实例。 无论如何, maxBound :: String
应该有什么价值? 您总是可以创建一个更长的字符串,或者将另一个元素添加到列表中。 由于您无法派生实例,因此您必须手动编写Enum
实例,如larsmans answer和类似的Bounded
实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.