2

だから、私は Haskell の初心者で、質問がたくさんあります。私は数冊の本を読んでいて、自分でいくつかのことをやろうとしています.リテラルがeqを実装していないと不平を言っている理由を誰かが説明してもらえますか.eqが必要な理由は理解していますが、私はしません.これが数値ではなくリテラルと見なされる理由や、それを変更する方法がわかりません。

generateListOfRandoms :: a -> b -> c -> d -> [(d, (a, b))]
generateListOfRandoms _ _ 0 _ = []
generateListOfRandoms rangeStart rangeEnd numberOfRandoms randGenerator =
    (randGenerator, (rangeStart,rangeEnd))  : generateListOfRandoms rangeStart rangeEnd (numberOfRandoms-1) randGenerator

一部の人が推測できるように、IO関数を指定しようとすると、関数が他の方法で失敗すると確信していますが、なぜこのエラーが発生するのか、今は混乱しています:

src\Main.hs:23:27:
    No instance for (Eq c)
      arising from the literal `0'
    In the pattern: 0
    In an equation for `generateListOfRandoms':
        generateListOfRandoms _ _ 0 _ = []
4

1 に答える 1

8

数値リテラルを使用する場合、対応する引数の型はNumクラスに属している必要があります。また、数値リテラルに対してパターンマッチングを行っているため、Eqクラスに属する型が必要です。これらの制約を型アノテーションに追加する必要があります。

generateListOfRandoms :: (Num c, Eq c) => a -> b -> c -> d -> [(d, (a, b))]

GHC-7.4を使用していない場合、制約は最近変更Eqされた制約によって暗示されるNumため、両方を使用する場合は、両方を明示的に指定する必要があります。

于 2012-06-11T00:49:51.253 に答える