簡體   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