Когда есть только два случая, вы можете сопоставить их с логическими значениями и использовать Data.List.partition
.
Prelude Data.List> partition odd [1, 23, 42, 7, 1337, 8]
([1,23,7,1337],[42,8])
В общем случае вы можете использовать Data.Map
со списком или в качестве типа значения.Вы можете легко создать его, используя Data.Map.fromListWith
.
Prelude Data.Map> let partition f xs = fromListWith (++) [(f x, [x]) | x <- xs]
Prelude Data.Map> partition (`mod` 3) [1, 23, 42, 7, 1337, 8]
fromList [(0,[42]),(1,[7,1]),(2,[8,1337,23])]