如何在haskell中将文字设置为num

如何在haskell中将文字设置为num,haskell,Haskell,所以我是哈斯克尔的新手,问题很多。我一直在阅读几本书,并试图自己做一些事情,有人能告诉我为什么这是抱怨文字没有实现eq,我理解为什么eq是必要的-但我不明白为什么这被视为文字而不是数字,或者我如何改变它 generateListOfRandoms :: a -> b -> c -> d -> [(d, (a, b))] generateListOfRandoms _ _ 0 _ = [] generateListOfRandoms rangeStart rangeEnd

所以我是哈斯克尔的新手,问题很多。我一直在阅读几本书,并试图自己做一些事情,有人能告诉我为什么这是抱怨文字没有实现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 _ = []

如果使用数值文字,则相应参数的类型必须属于
Num
类。此外,由于您是针对数值文本进行模式匹配,因此需要该类型属于
Eq
类。您必须将这些约束添加到您的类型签名中

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

如果您没有使用GHC-7.4,则最近更改的
Num
约束暗示了
Eq
约束,因此,如果同时使用这两个参数,那么现在必须显式地声明这两个参数。

我也尝试过使用一个防护装置,但它只是抱怨文字0没有实现Eq而已。您的类型签名表示第三个参数可以是任何类型,但您肯定希望仅对数字类型进行限制(否则不能将
0
用作模式)。在Haskell中,可以将其表示为
(Num c)=>a->b->c->…
。谢谢!我以前尝试过这两种约束,但没有同时尝试。这就是它丢失的原因。
Num
Eq
的子类,所以只需
Num c=>…
就可以了sufficient@newacct正如Daniel指出的那样,
Num
不再是ghc 7.4中
Eq
的子类。