首先,类型签名格式错误。
deleteAllInstances :: (a, [l]) => a -> [l] -> [l]
类型签名具有以下形式
name :: (Constraints) => type
其中Constraints
涉及类型类,例如(Ord a, Show a)
. 在这种情况下,该函数使用(==)
,因此必须有一个形式的约束Eq a
。
然后函数定义与类型部分不匹配,您将其定义为将一对作为参数,而类型签名则另有说明(您的定义是非柯里化的,类型是柯里化的)。
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 _ _ = []