给定一个字符串列表和一个整数c我想过滤掉列表中c次的字符串。问题是我不知道如何在我的函数中使用下一个元素,因为我不能只使用第一个元素,因为那时函数将无法正常工作。
testfunc :: [String] -> Int -> [String]
testfunc list c
| (length(filter (==(head list)) list) == c) = testfunc (filter (/=(head list)) list) c
答案 0 :(得分:0)
如果返回列表中的元素与原始列表中的元素处于不同的相对位置,那么您可以轻松(并且具有更好的性能)通过排序>的组合解决此问题em>,分组和 concat 'ing:
testfunc list c = concat $ filter (\p -> length p /= c) $ group (sort list)
如果您想按照自己的方式进行操作,可以使用drop
跳过列表中的第一个元素(这是错误的,请参阅编辑):
testfunc list c
| list == [] = []
| (length(filter (==(head list)) list) == c) = testfunc (filter (/=(head list)) list) c
| otherwise = testfunc (drop 1 list) c
我非常确定我理解你的问题,这就是你所需要的吗?
编辑:现在我理解你的问题了,你的功能在获取第一个元素后无法正常工作。如果保持秩序很重要,你可以试试:
testfunc list c = filter (\s -> s `elem` validStrings) list
where validStrings = map head $ filter (\p -> length p /= c) $ group (sort list)