haskell - 从列表中删除所有实例

标签 haskell recursion functional-programming

我正在尝试使用 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/

相关文章:

scala - 函数式编程是否可以减少冯·诺依曼瓶颈?

recursion - Fortran 95 中的 `Error: Return type mismatch of function`

scala - 在scala中压缩不等长列表

java - java奇怪的递归优化

performance - 对于小矩阵,纯 Haskell 比 HMatrix 快 10 到 100 倍?

haskell - 如何总结 Int 和 Int64?

algorithm - 找到除以haskell的阶乘的数字的最大幂

haskell - Haskell 迷你语言

sql - 递归 CTE Material list

在C中使用递归计算pi值