Функция Haskell, которая принимает две строки и фильтрует вторую по первому - PullRequest
0 голосов
/ 12 сентября 2018

Цель: используя foldr, определить функцию remove , которая принимает в качестве аргументов две строки и удаляет каждую букву из второго списка, который встречается в первом списке. Например, remove "first" "second" = "econd".

Если бы эта функция принимала один символ и строку, я бы сделал:

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

Но я не могу понять, как я должен делать это с двумя строками. Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018
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.

0 голосов
/ 12 сентября 2018
remove xs ys = foldr (\x acc -> if elem x xs then acc else x : acc) [] ys

да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...