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