I have a function I'm supposed to define like so:
func :: (a -> Maybe [b]) -> [a] -> Maybe [b]
Some examples of how it's supposed to work :
func (\x -> if x == 0 then Nothing else Just [x]) [1,2]
Should result in:
Just [1,2]
Another example:
func (\x -> if x == 0 then Nothing else Just [x]) [1,0]
Nothing
If anything in the list is a Nothing
, then the function returns Nothing
. Otherwise if all the elements in the list return a Just [x]
then it's supposed to return a list like: Just [x1, x2, ...]
.
I tried using fmap
for similar calls to the above which returns something like:
[Just [1], Just [2], ...]
If I use sequence
on the list fmap
returns, it'll follow the rules of the above (returning a Nothing
if anything in the list is a Nothing
), which is great. Except it returns a list like this:
Just [[1],[2]]
which is not the format I need. In that case I would need it to be:
Just [1,2]
As I just started learning Haskell and monads are still a fresh topic to me, I'm having some trouble figuring how to format this list or if there's a better way of solving this problem. I cannot change the function type signature.
To turn a list like [[1],[2]]
, into [1,2]
, use concat
. In your case, since the list is inside a Maybe
, you'll need to call fmap concat
on it.
Also, note that any time you call sequence
(or sequenceA
) on the result of map
, fmap
, or <$>
, you can save a function by combining both into mapM
(or traverse
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With