首先,类型签名的格式不正确。
deleteAllInstances :: (a, [l]) => a -> [l] -> [l]
A型签名的形式
name :: (Constraints) => type
其中Constraints
涉及类型类,像(Ord a, Show a)
。在这种情况下,该功能使用(==)
,因此必须有Eq a
的限制。
然后函数定义与类型部分不匹配,您定义它将一对作为参数,而类型签名另有说明(您的定义不确定,类型为curried)。
deleteAllInstances (a, []) = []
deleteAllInstances (i, (x:xs))
| i == x = tail
| otherwise = x ++ tail
where tail = deleteAllInstances i xs
然后使用(++)
一个元素胶水列表的前面,但(++)
连接两个列表,你需要(:)
这里。
定义函数是使用filter
deleteAllInstances :: Eq a => a -> [a] -> [a]
deleteAllInstances a xs = filter (/= a) xs
,但如果你想自己做明确的递归最简单的方法,
deleteAllInstances :: Eq a => a -> [a] -> [a]
deleteAllInstances a (x:xs)
| a == x = rest
| otherwise = x : rest
where
rest = deleteAllInstances a xs
deleteAllInstances _ _ = []
你会得到哪个错误? – 2012-04-11 21:27:40