Немного странный вопрос, но после комментария
Я не вижу понятия «пустой кортеж» в haskell
Я думаю, я вижу, где вы 'приходит из.На самом деле в Haskell есть «пустые кортежи»: тип блока ()
- это тип «кортежей с нулевыми элементами».Так что вы думаете о
fn tuples = map (\(x,y) -> if x + y > 5 then (x,y) else ()) tuples
Но это не сработает, потому что ()
это другой тип от (Int,Int)
.Все элементы списка должны иметь одинаковый тип.Даже если бы это сработало, как в динамических типах, результат fn [(3,4), (4,4), (0,1)]
на самом деле был бы [(3,4), (4,4), ()]
.Т.е. вы все равно получите три элемента, только один из них будет «скучным».
map
фактически обеспечивает гарантию, что никогда не изменит количество элементов в списке, только значения ихэлементы.Так что, если вы хотите , вам нужно использовать другую функцию.Наиболее близким к вашему подходу будет concatMap
:
fn tuples = concatMap (\(x,y) -> if x + y > 5 then [(x,y)] else []) tuples
То, что здесь происходит, также может быть описано в два этапа:
- Вы отображаете функциюкоторый генерирует список для каждого элемента.В результате получается список списков.
- Вы сгладили этот список.
Итак [(3,4), (4,4), (0,1)]
-> [[(3,4)], [(4,4)], []]
-> [(3,4), (4,4)]
.
На самом деле, здесь вообще нет необходимости использовать шаг отображения - элементы сохраняются такими, какие они есть в конечном итоге, поэтому filter
- это инструмент для использования.