我有一个Main模块,它导入Users模块(不公开任何内容)。
在Main中,我通常使用startApp,只使用来自Main模块的定义:
app =
StartApp.start
{ init = init
, inputs = [Signal.map TopBar topBarActionPort]
, update = update
, view = view
}但埃尔姆反应堆正在抱怨,并试图使用Users模块,这是没有意义的。见下面的信息。
函数start期望参数为:
{ ...
, inputs : List (Signal Users.Action)
, update : Users.Action -> Model -> ( Model, Effects Users.Action )
, view : Address Users.Action -> Model -> Html
}但它是:
{ ...
, inputs : List (Signal Action)
, update : Action -> Model -> ( Model, Effects Action )
, view : Address Action -> Model -> Html
}如何使编译器按应有的方式使用Main模块函数??
发布于 2016-05-05 11:21:26
这通常表示“冒泡”到start的类型推断错误。
类型注释在Elm中并不是必需的,如果您不显式地给函数一个类型签名,那么Elm将推断它。
对于一个简单的例子--假设我有以下两个函数:
getUsers = { name = "Bob", age = 42 }
getUserNames = List.map .name getUsers -- compiler error!getUsers的名称似乎意味着它应该返回一个列表,但是基于它的返回类型,Elm将getUsers编译为类型User而不是List User。因此,getUsers编译得很好(尽管使用了您不期望的推断类型签名)。
但是,编译器会告诉您,函数getUserNames有问题,尽管问题的根源在于getUsers定义错误。
这种冒泡效应可能就是为什么您会看到指向start函数的奇怪的编译器错误。跟踪哪些函数不正确的方法是在所有模块中添加类型注释。
考虑上面这个微不足道的例子。如果我要注释我的函数,编译器就会在问题的根源上抱怨函数。
getUsers : List User
getUsers = { name = "Bob", age = 42 } -- compiler error!
getUserNames : List String
getUserNames = List.map .name getUsersElm的类型推断功能强大,非常有用,但如果以嵌套的方式使用,有时会导致奇怪的、看似无关的编译器错误。一个很好的经验法则是注释我模块中所有公开公开的函数。
https://stackoverflow.com/questions/37036068
复制相似问题