Как создать два списка в Haskell

Как мне взять список в haskell и на выходе создать два списка?

Например, в вопросе, над которым я работаю, предлагается создать программу, которая принимает предикат и список и возвращает список из двух списков, первый из которых содержит те элементы входного списка, которые передают предикат, а второй - те, которые не передают его. заказ, например

 tear (>5) [1,10,2,12,3,13]

=> [[10,12,13],[1,2,3]]

Что у меня есть на данный момент:

tear f [] = []
tear f (x:xs)
 | f x = x: tear f xs
 | otherwise = tear f xs

Что производит

tear (>5) [1,10,2,12,3,13]
[10,12,13]

person Lukas Clarke    schedule 06.01.2019    source источник
comment
Если вы всегда хотите возвращать два списка, то кортеж из двух списков, вероятно, имеет больше смысла, чем список, содержащий списки.   -  person Willem Van Onsem    schedule 06.01.2019
comment
Вы можете привести мне пример, как это сделать? Извините, как я уже сказал, я новичок в Haskell   -  person Lukas Clarke    schedule 06.01.2019
comment
Почему этот вопрос отвергается без объяснения причин?   -  person Wong Jia Hau    schedule 07.01.2019


Ответы (1)


Следуя предложению @ WillemVanOnsem использовать 2-кортеж:

tear f [] = ([],[])
tear f (x:xs)
 | f x = (x:y,z)
 | otherwise = (y,x:z)
    where (y,z) = tear f xs
person happydave    schedule 06.01.2019
comment
Обратите внимание: если вам действительно нужен список из двух элементов, а не кортеж, вы можете просто заменить все круглые скобки квадратными скобками (кроме второй строки). - person happydave; 06.01.2019
comment
Спасибо, это именно то, что я хотел знать! - person Lukas Clarke; 06.01.2019