#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]]