目标是:使用foldr
,定义一个函数 remove ,该函数将两个字符串作为参数,并从第二个列表中删除出现在第一个列表中的每个字母。例如,remove "first" "second" = "econd"
。
如果此函数使用单个字符和一个字符串,我会这样做:
remove a xs = foldr (\x acc -> if x /= a then x : acc else acc) [] xs
但是我无法弄清楚应该如何使用两个字符串来执行此操作。谢谢!
答案 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二进制运算符从“”构建新的字符串。