How to get the value of a Maybe in Haskell

前端 未结 5 664
南旧
南旧 2021-01-31 08:15

I\'m relatively new to Haskell and began to read \"Real World Haskell\".

I Just stumbled over the type Maybe and have a question about how to receive the actual value fr

5条回答
  •  北荒
    北荒 (楼主)
    2021-01-31 08:57

    The eliminate function's type signature is:

    eliminate :: Maybe Int -> Int
    

    That's because it returns 0 on Nothing, forcing the compiler to assume that a :: Int in your eliminate function. Hence, the compiler deduces the type signature of the combine function to be:

    combine :: Maybe Int -> Maybe Int -> Maybe Int -> (Int, Int, Int)
    

    and that's precisely why it doesn't work when you pass a String to it.

    If you wrote it as:

    combine a b c = (eliminate a, eliminate b, eliminate c)
                    where eliminate (Just a) = a
                          eliminate Nothing = undefined
    

    then it would have worked with String or with any other type. The reason relies on the fact that undefined :: a, which makes eliminate polymorphic and applicable to types other than Int.

    Of course, that's not the aim of your code, i.e., to make the combine function total.

    Indeed, even if an application of combine to some Nothing arguments would succeed (that's because Haskell is lazy by default), as soon as you try to evaluate the results you would get a runtime error as undefined can't be evaluated to something useful (to put it in simple terms).

提交回复
热议问题