#haskell
#haskell
Вопрос:
Я пытаюсь удалить число (если оно существует) из подсписков, используя функции более высокого порядка.
removeAux :: Int -> [[Int]] -> (Int -> [Int] -> Bool) -> [[Int]]
removeAux num (l:ls) f
| f num l = delete num l -- ERROR in this line
|otherwise = removeAux num ls f
removeFromSublists :: Int -> [[Int]] -> [[Int]]
removeFromSublists _ [[]] = [[]]
removeFromSublists num ls = removeAux num ls (elem)
И предполагается, что это будет работать следующим образом:
> l = [[0,1,2],[2,3]]
> removeFromSublists 1 l
[[0,2],[2,3]]
> removeFromSublists 0 l $ removeFromSubLists 1 l
[[2],[2,3]]
> removeFromSublists 2 l
[[0,1],[3]]
Но у меня есть две проблемы, которые я не знаю, как решить. Сначала он не удалит все вхождения числа, и это должно? И я не могу понять, почему код не работает?
Я продолжаю получать ошибку:
Может кто-нибудь мне помочь, пожалуйста?
Комментарии:
1. самый простой способ сделать это, на мой взгляд, — просто объединить основные
map
иfilter
функции для списков2. @RobinZigmond извините, но я не вижу, как ?!
Ответ №1:
Здесь может помочь использовать подход, основанный на типах. Например, вы хотите удалить все вхождения некоторого элемента из списка элементов списка.
Это означает, что «учитывая an a
и список list of a's
( [[a]]
) возвращает список list of a
‘s ( [[a]]
):
removeAll :: Eq a => a -> [[a]] -> [[a]]
removeAll v (list:listOfLists) = ???
Мы удаляем все v
из каждого list
списка (list:listOfLists)
. Другой способ сказать это «для каждого list
в нашем listOfLists
фильтре v
«.
Итак, мы хотим выполнить одно и то же действие (фильтр) для каждого значения в списке. В Haskell это означает сопоставление действия фильтра над каждым list
в listOfLists
.
removeAll :: Eq a => a -> [[a]] -> [[a]]
removeAll v xs = map (filter (/= v)) xs