如何让我的文字成为haskell中的数字

时间:2012-06-11 00:37:32

标签: haskell

所以我是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 _ = []

1 个答案:

答案 0 :(得分:8)

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

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

如果您不使用GHC-7.4,Eq约束隐含了Num约束,该约束最近已被更改,所以现在您必须明确说明两者。