3

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]

それは私に可能な修正を与えますが、私はそれが何を意味するのか理解していません。誰かがそれを説明し、それを修正する方法を教えてもらえますか?

4

3 に答える 3

3

minBoundandmaxBoundは、タイプの意味を事前に宣言しない限り使用できません(ちなみに、これはレコード タイプではありません)。エラーにも示されているように、型をinstanceofとして宣言する必要がありBoundedます。型が何を表すかを知らなければ、そのような宣言が正確にどのように見えるべきかを言うことは不可能ですが、その一般的な形式は次のとおりです。

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

( に記入してください...)

于 2011-10-20T17:50:33.657 に答える
2

type の値を列挙する方法を教えていませんTestListminBound何が何であるかを理解してmaxBoundいても、その間にあるすべての値が何であるかを発見する方法はわかりません (それらの値でリストを作成するため)。

のインスタンス宣言を追加することにより、Enum TestList基本的に値を列挙する方法を指示することになるため、そのシーケンスを構築できます。

于 2011-10-20T17:51:51.367 に答える
1

ここには 2 つの問題があります。まず、インスタンスを作成する必要がありEnumます (他の人が言ったように)。特殊なEnum列挙構文を使用したため、インスタンスが必要です[ a .. b]

インスタンスを作成したら、と を使用したため、Enumのインスタンスも作成する必要があります。BoundedminBoundmaxBound

通常、Haskell コンパイラにこれらのインスタンスの両方を派生させるように指示できますが、List も String もいずれの型クラスのインスタンスも持たないため、ここでは機能しません。maxBound :: Stringとにかく、どのような値が必要ですか?いつでもより長い文字列を作成したり、別の要素をリストに追加したりできます。インスタンスを派生させることはできないため、Enumlarsmans answer と同様にBoundedインスタンスのようにインスタンスを手動で記述する必要があります。

于 2011-10-20T18:12:05.743 に答える