Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Haskell中的列表中删除项目_Haskell - Fatal编程技术网

从Haskell中的列表中删除项目

从Haskell中的列表中删除项目,haskell,Haskell,如何从Haskell中的列表中删除项目? 我有这个代码,但似乎不起作用。这个概念,我有两个列表,列表总是只有一个元素。bList将始终具有其在列表中的元素。因此,我想从bList中删除元素,并在最后输出不带该项的新列表。能给我一些提示吗? 谢谢 removeFromList :: aList -> bList -> finalList removeFromList [] _ = [] removeFromList (y:ys) (x:xs)

如何从Haskell中的列表中删除项目? 我有这个代码,但似乎不起作用。这个概念,我有两个列表,列表总是只有一个元素。bList将始终具有其在列表中的元素。因此,我想从bList中删除元素,并在最后输出不带该项的新列表。能给我一些提示吗? 谢谢

removeFromList :: aList -> bList -> finalList
removeFromList [] _           = []
removeFromList (y:ys) (x:xs)
                  | y == x = removeFromDatabase y xs
                  | otherwise = y : removeFromDatabase y xs 
有几个问题:

第一个列表应该包含该元素,但您似乎是从第一个子句中的第二个列表中获取该元素,因此它应该是:

removeFromList _ [] = []
其次,在进行递归调用时,需要重新创建包含单个元素的列表,即
removeFromList[y]xs

第三,列表类型应该是相同的,您需要
==

Eq
约束,只要在
列表中始终有一个元素,我就提出另一个解决方案:

removeFromList :: Eq a => [a] -> [a] -> [a]
removeFromList [elem] = filter (== elem)
或者,如果该元素只出现一次:

import Data.List
removeFromList [elem] = delete elem
但是请记住,如果第一个参数以某种方式显示为空或包含多个元素,那么它将失败

代码中的问题:

  • 您使用的
    aList
    bList
    不是作为参数名,而是作为函数签名中的类型变量,它们过于通用(相当于
    removeFromList::a->b->c
  • 递归调用函数时,传递的是
    y
    ,它是单个元素,而不是列表

删除xs ys=[y | y aaaa,我可以通过草稿进行废弃。同样是+1,尽管我建议删除参数周围的列表(
rfl::Eq a=>a->[a]->[a]
)我同意,但是发问者要求第一个参数是一个列表-可能这个函数已经在某个地方使用了。或者可能他们从一开始就有错误的声明:)你可以使用
ys@(y:)
removeFromList ys
,而不是每次都构建一个新的列表。
import Data.List
removeFromList [elem] = delete elem