繁体   English   中英

haskell:创建记录列表

[英]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]

它给了我一个可能的修复,但我不明白它的含义。 任何人都可以解释它并告诉我如何解决它。

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

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

(填写...

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

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

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

一旦你创建了Enum实例,你还需要为Bounded编写一个实例,因为你已经使用了minBoundmaxBound

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM