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