榆树 Maybe.withDefault

Elm Maybe.withDefault

我需要在我的一个更新函数中解包 Maybe -值:

update msg model =

  case msg of

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

这当然是伪代码,

 Maybe.withDefault 100 (Just 42)

直接从 documentation for Maybe 中取出,实际上不应该做任何事情。编译器抱怨说:

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

为什么说 "withDefault" 期望第一个参数是

a -> b

定义为

a -> Maybe a -> a

在文档中?

您不小心离开了 model:

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

这使得类型推断算法认为 Maybe.withDefault 100 (Just 42) 应该评估一个可以采用此 model 参数的函数。为了使它有意义,它期望 10042 是函数,但它们不是,所以它告诉你。

看一个有效的例子可能会有所帮助:

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

Maybe.withDefault identity (Just f) 0 

这将计算为 1。