How can I add something to a list when a condition is true and do nothing otherwise in Haskell?
I was hoping to find a better way to solve a problem I've encountered in Haskell.
Given a list and a condition create a new list with only elements which satisfy the condition. Below is a solution I used. Is there a better alternative which doesn't involve maybes?
eg :: (Eq a, Num a) => (a -> Bool) -> [a] -> [a]
eg cond i = catMaybes (map (\x-> if cond x then Just x else Nothing) i)
Solution 1:
Your eg
is equivalent to filter :: (a -> Bool) -> [a] -> [a]
. Indeed, you can filter with:
filter (\x -> some_condition x) my_list
If some_condition
is for example a simple a -> Bool
function, this is equivalent to:
filter some_condition my_list
Neither your implementation of eg
nor the one with filter require the Eq a
and Num a
type constraints by the way: one can simply use guards or pattern match on the outcome of cond x
.
filter
is implemented with explicit recursion [src]:
filter :: (a -> Bool) -> [a] -> [a] filter _pred [] = [] filter pred (x:xs) | pred x = x : filter pred xs | otherwise = filter pred xs
Here for an empty list it thus returns the empty list, and when the list is not empty, it will only prepend x
if pred x
is satisfied.