Удалить из подсписков

#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