2016-08-09 91 views
1

我需要解开一个可能 - 值在我更新功能之一:榆树Maybe.withDefault

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 

文档?

+0

看起来你有一些奇怪的语法错误在你的代码和编译器无法识别它。尝试换行'(Maybe.withDefault 100(只是42))'或将更多代码添加到您的示例中。 – halfzebra

+0

@halfzebra给出了完全相同的错误。我不想粘贴完整的代码路径,因为它的大,嵌套和模块化,这将使问题有点具体。但是我可以说“val”只是一个简单的字符串进来。所以你说的是我可以在上面的代码之外导致错误的语法错误?我试着澄清一下我的问题。 – swelet

回答

7

你不小心留在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

+0

谢谢Sören!我如何重写它以避免这种情况?只是将它包装在parens中:(Maybe.withDefault 100(只是42))给出了同样的错误! – swelet

+1

用'model'删除这一行吗? –

+0

我需要的情况下返回“模型”。我想我在这里错过了一些东西(功能性编程很新颖)。在从案例中返回一些东西之前不可能执行一些任意代码吗? – swelet