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 回答