Elm - StartApp 类型问题

Elm - StartApp type issue

我有一个 Main 模块导入 Users 模块(不暴露任何东西)。

Main 中,我以正常方式使用 startApp,仅使用 Main 模块中的定义:

app =
  StartApp.start
    { init = init
    , inputs = [Signal.map TopBar topBarActionPort]
    , update = update
    , view = view
    }

但是 Elm Reactor 正在抱怨并试图使用没有意义的 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模块函数??

这通常表示 "bubbles up" 到 start 的类型推断错误。

Elm 中不需要类型注释,如果您不显式地为函数提供类型签名,Elm 将推断它。

举个简单的例子——假设我有这两个函数:

getUsers = { name = "Bob", age = 42 }

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

getUsers 的名称似乎暗示它应该 return 一个列表,但是基于它的 return 类型,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 getUsers

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