我正在尝试使用 haskell 删除列表中某个项目的所有实例。我收到一个我不太明白的错误。谁能帮助我并让我知道我做的事情是否正确?
deleteAllInstances :: (a, [l]) => a -> [l] -> [l]
deleteAllInstances (a, []) = []
deleteAllInstances (i, (x:xs))
| i == x = tail
| otherwise = x ++ tail
where tail = deleteAllInstances i xs
最佳答案
首先,类型签名格式错误。
deleteAllInstances :: (a, [l]) => a -> [l] -> [l]
类型签名具有以下形式
name :: (Constraints) => type
哪里Constraints
涉及类型类,例如 (Ord a, Show a)
。在本例中,该函数使用 (==)
,因此必须存在 Eq a
形式的约束.
那么函数定义与类型部分不匹配,您将其定义为以一对作为参数,而类型签名则不然(您的定义未柯里化(Currying),类型已柯里化(Currying))。
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 _ _ = []
关于haskell - 从列表中删除所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114228/