Haskell函数,它接收两个字符串并根据第一个过滤第二个字符串

时间:2018-09-12 20:46:22

标签: list haskell filter

目标是:使用foldr,定义一个函数 remove ,该函数将两个字符串作为参数,并从第二个列表中删除出现在第一个列表中的每个字母。例如,remove "first" "second" = "econd"

如果此函数使用单个字符和一个字符串,我会这样做:

remove a xs = foldr (\x acc -> if x /= a then x : acc else acc) [] xs

但是我无法弄清楚应该如何使用两个字符串来执行此操作。谢谢!

2 个答案:

答案 0 :(得分:5)

remove xs ys = foldr (\x acc -> if elem x xs then acc else x : acc) [] ys

是的

答案 1 :(得分:1)

remove :: String -> String -> String                       
remove xs ys = foldr (condCons) "" ys
  where
    condCons l rs | l `notElem` xs = l : rs
                  | otherwise = rs

还可以丢弃'ys'参数:

remove :: String -> String -> String                       
remove xs = foldr (condCons) ""
  where
    condCons l rs | l `notElem` xs = l : rs
                  | otherwise = rs

基本上,condCons包含字符L和字符串Rs。如果L不是xs的元素,则它等于Rs,否则保持Rs不变。 foldr使用condCons,初始字符串“”和第二个参数ys。 L从右到左接管字符串ys的每个字符,并使用condCons二进制运算符从“”构建新的字符串。