问题描述
|
我一直在尝试编写一个小文件来尝试一个类似包的数据结构。到目前为止,我的代码如下:
data Fruit = Apple | Banana | Pear deriving (Eq,Show)
data Bag a = EmptyBag | Contents [(a,Integer)]
emptyBag :: Bag a
emptyBag = EmptyBag
unwrap :: [a] -> a
unwrap [x] = x
isObject theObject (obj,inte) = theObject == obj
count :: Bag a -> a -> Integer
count (Contents [xs]) theObject = snd (unwrap (filter (isObject theObject) [xs]))
count EmptyBag _ = 0
但是当我尝试运行它时,我得到了错误
无法根据上下文()推论(等式a)
由于在...处使用\'isObject \'而产生。
而当我取出count函数并调用时
snd(unwrap(filter(isObject Banana)[(Apple,1),(Banana,2)]))
高兴地返回2。
任何关于这是为什么的线索,或关于编写这种数据结构的建议,将不胜感激。
解决方法
(==)
只能在包含Eq
的上下文中使用,但是当您声明count
时,您没有包括该上下文。如果我阅读正确,那将是
count :: Eq a => Bag a -> a -> Integer
如果在不包括类型的情况下声明count
,则可以要求ghci
作为推断的类型;否则,您可以向ask6ѭ请求推断的类型。或索要ѭ7的推断类型