Как удалить пустые списки из вложенного списка с помощью понимания в Haskell

#haskell

#haskell

Вопрос:

Я только начал изучать Haskell и начал изучать понимание понимания, которое позволяет мне формировать подмножество, задавая условия для большего набора.

Я попытался создать понимание, которое принимает вложенный список (содержащий другие целочисленные списки) и удаляет из них все положительные нечетные числа и пустые внутренние списки.

 testList= [-3]:[-5,8]:[[1,3,5,7,9],[],[4,6,8,10],[1,3,6,7,9],[],[1]]

removingOnlyPosOdds xxs = [ [x | x <-xs, not (odd x amp;amp; x > 0 )] | xs <- xxs, [] /= xs ] 

  

testList перед применением функции понимания к нему выглядело так:

[[-3],[-5,8],[1,3,5,7,9],[],[4,6,8,10],[1,3,6,7,9],[],[1]]

После применения removingOnlyPosOdds TestList

 The outcome was 
[[-3],[-5,8],[],[4,6,8,10],[6],[]] 
  

Итак, я понял, что "[] /= xs" в описании функции удалялось уже существующее

"[]" testList только внутренние списки; но не новые, которые были сформированы из-за того, что я удалил положительные нечетные числа из внутренних списков.

Каким должен быть мой следующий шаг, чтобы удалить их также с точки зрения кода?

Я хочу, чтобы это выглядело так

[[-3],[-5,8],[4,6,8,10],[6]]

Есть ли способ обобщить понимание, чтобы сделать это за один раз?

Или есть другой подход, который был бы намного лучше для удаления объектов (например, пустых внутренних списков) и создания более определенного набора?

Ответ №1:

Вы можете добавить дополнительную фильтрацию и предотвратить повторное понимание одного и того же списка с let помощью предложения, например:

 removingOnlyPosOdds xxs = [ ys | xs <- xxs, let ys = [x | x <-xs, not (odd x amp;amp; x > 0 )], not (null ys)  ]  

Или мы можем просто добавить дополнительную фильтрацию, например:

 removingOnlyPosOdds :: Integral i => [[i]] -> [[i]]
removingOnlyPosOdds = filter (not . null) . map (filter (x -> not (odd x amp;amp; x > 0)))  

или даже больше без точек:

 import Control.Monad(liftM2)

removingOnlyPosOdds :: Integral i => [[i]] -> [[i]]
removingOnlyPosOdds = filter (not . null) . map (filter (not . liftM2 (amp;amp;) odd (>0)))  

Например:

 Prelude> removingOnlyPosOdds [[-3],[-5,8],[1,3,5,7,9],[],[4,6,8,10],[1,3,6,7,9],[],[1]]
[[-3],[-5,8],[4,6,8,10],[6]]