How to make errors bubble up quickly?


say I have a List String that I want to transform into a List Int.
In an imperative language, I would use a for loop and at the first string that can’t be converted into an int, I would throw an exception.
But how would I achieve something similar in Elm?

I think I’d like to write a function that has this signature:

mapOrFail : (a -> Maybe b) -> List a -> Maybe (List b)

If all the values in the first list map to Just variants, then all is good and a Just (List b) is returned.
But at the first value that maps to a Nothing, no more computation would be done and I would get Nothing returned from the whole function.
How would you achieve that? I guess I would have to use some kind of lazy functionality of the language?

Elm has no lazyness. You can do what you want with recursion:

mapOrFail toMaybeB theAs =
    mapOrFailHelper toMaybeB [] theAs

mapOrFailHelper toMaybeB reversedBs theAs =
    case theAs of
        [] -> Just (List.reverse reversedBs)
        a::otherAs ->
            case toMaybeB a of
                   Just b -> mapOrFailHelper toMaybeB  (b :: reversedBs) otherAs
                   Nothing ->  Nothing

It is a bit entangled since you want stop the computation as soon as possible. Feel free to ask for clarification.


Excellent, thank you!

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.