swelet
swelet

Reputation: 8722

Elm Maybe.withDefault

I need to unwrap a Maybe -value in one of my update functions:

update msg model =

  case msg of

    UpdateMainContent val ->
      Maybe.withDefault 100 (Just 42)
      model

This of course is dummy code and the

 Maybe.withDefault 100 (Just 42)

is taken straight out of the documentation for Maybe and not supposed to actually do anything. The compiler is complaining and saying:

Detected errors in 1 module.


-- TYPE MISMATCH ----------------------------------- ./src/Review/Form/State.elm

The 1st argument to function `withDefault` is causing a mismatch.

15|>             Maybe.withDefault 100 (Just 42))
16|             -- Maybe.withDefault 100 (model.activeItem)
17|             model

Function `withDefault` is expecting the 1st argument to be:

    a -> b

But it is:

    number

Why is it saying that "withDefault" is expecting the first argument to be

a -> b

when it is defined as

a -> Maybe a -> a

in the documentation?

Upvotes: 1

Views: 3919

Answers (1)

Søren Debois
Søren Debois

Reputation: 5688

You accidentally left in model:

UpdateMainContent val ->
  Maybe.withDefault 100 (Just 42)
  model --  <-- here

This makes the type inference algorithm think that Maybe.withDefault 100 (Just 42) should evaluate to a function that can take this model argument. For that to make sense, it expects 100 and 42 to be functions, but they aren't, and so it tells you.

It might help to see an example where this works:

f : Int -> Int
f x = x + 1

Maybe.withDefault identity (Just f) 0 

This will evaluate to 1.

Upvotes: 8

Related Questions