所以我是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 _ = []
答案 0 :(得分:8)
如果使用数字文字,则相应参数的类型必须属于Num
类。此外,由于您是对数字文字进行模式匹配,因此您需要该类型属于Eq
类。您必须将这些约束添加到您的类型签名
generateListOfRandoms :: (Num c, Eq c) => a -> b -> c -> d -> [(d, (a, b))]
如果您不使用GHC-7.4,Eq
约束隐含了Num
约束,该约束最近已被更改,所以现在您必须明确说明两者。