2012-10-09 53 views
0

我想定义一个Haskell函数,该函数从字符串列表中删除包含在一对字符串中的任何字符串,并仅返回包含所有剩余字符串的列表。因此,一个例子是:使用一对字符串筛选字符串列表

function ["football","basketball","soccer"] ("football", "basketball") = ["soccer"] 

我知道你可以使用filter功能来过滤满足给定谓词列表。我知道我可以通过这种方式筛选出一个列表:

function' xs s = filter (/=s) xs 

但是我不知道如何让它与元组一起工作。我在运行代码时不断收到错误。任何想法如何做到这一点?由于

回答

1
myfunc :: Eq a => [a] -> (a, a) -> [a] 
myfunc xs (a,b) = filter (\x -> (x /= a) && (x /= b)) xs 

让我们看到的filter

filter :: (a -> Bool) -> [a] -> [a] 

当你这样做filter f xs, 它只是适用a -> Bool型的功能f上的列表中的所有元素去除那些该函数返回False类型。

我有模式匹配的元组元素为(a,b)和我刚刚定义功能f\x -> (x /= a) && (x /= b)。这是一个匿名函数,它只接受列表中的一个元素,并且仅当它不等于元组的第一个元素,也不等于第二个元素时返回True&&是布尔型and,所以只有当它的参数都是True时它才返回True

+0

Eq a => [a] -> [a] -> [a] 

快速搜索,你可以解释这一点进一步:

所以,我们正在寻找一些与类型。我想确保我正确理解这一点。谢谢 – Bobo

+0

@Bobo我已经添加了解释。 – Satvik

+0

感谢您的解释! – Bobo

1

最直接的方法是运行你的过滤器两次,像这样。

tupleFilter :: (Eq a) => [a] -> (a, a) -> [a] 
tupleFilter xs (a, b) = function' (function' xs a) b 

在这里虽然关键是你模式匹配(或以其他方式解构)使用的过滤器中的元素在你的元组。

这里是一个没有你的中间过滤器功能的版本,在这种情况下可能为了将来的可读性而内联。

tupleFilter xs (a, b) = filter (\x -> (x /= a) && (x /= b)) xs 
2

更通用的解决方案将使用字符串列表来过滤而不是一对。一个更通用的解决方案将使用支持Eq而不仅仅是字符串的任何列表。在hoogle产量(\\)

import Data.List ((\\)) 

main = print $ ["football","basketball","soccer"] \\ ["football", "basketball"]