首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elm - StartApp型发行

Elm - StartApp型发行
EN

Stack Overflow用户
提问于 2016-05-04 19:09:54
回答 1查看 46关注 0票数 0

我有一个Main模块,它导入Users模块(不公开任何内容)。

Main中,我通常使用startApp,只使用来自Main模块的定义:

代码语言:javascript
复制
app =
  StartApp.start
    { init = init
    , inputs = [Signal.map TopBar topBarActionPort]
    , update = update
    , view = view
    }

但埃尔姆反应堆正在抱怨,并试图使用Users模块,这是没有意义的。见下面的信息。

函数start期望参数为:

代码语言:javascript
复制
{ ...
, inputs : List (Signal Users.Action)
, update : Users.Action -> Model -> ( Model, Effects Users.Action )
, view : Address Users.Action -> Model -> Html
}

但它是:

代码语言:javascript
复制
{ ...
, inputs : List (Signal Action)
, update : Action -> Model -> ( Model, Effects Action )
, view : Address Action -> Model -> Html
}

如何使编译器按应有的方式使用Main模块函数??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-05 11:21:26

这通常表示“冒泡”到start的类型推断错误。

类型注释在Elm中并不是必需的,如果您不显式地给函数一个类型签名,那么Elm将推断它。

对于一个简单的例子--假设我有以下两个函数:

代码语言:javascript
复制
getUsers = { name = "Bob", age = 42 }

getUserNames = List.map .name getUsers -- compiler error!

getUsers的名称似乎意味着它应该返回一个列表,但是基于它的返回类型,Elm将getUsers编译为类型User而不是List User。因此,getUsers编译得很好(尽管使用了您不期望的推断类型签名)。

但是,编译器会告诉您,函数getUserNames有问题,尽管问题的根源在于getUsers定义错误。

这种冒泡效应可能就是为什么您会看到指向start函数的奇怪的编译器错误。跟踪哪些函数不正确的方法是在所有模块中添加类型注释。

考虑上面这个微不足道的例子。如果我要注释我的函数,编译器就会在问题的根源上抱怨函数。

代码语言:javascript
复制
getUsers : List User
getUsers = { name = "Bob", age = 42 } -- compiler error!

getUserNames : List String
getUserNames = List.map .name getUsers

Elm的类型推断功能强大,非常有用,但如果以嵌套的方式使用,有时会导致奇怪的、看似无关的编译器错误。一个很好的经验法则是注释我模块中所有公开公开的函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37036068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档