榆树输入中带有额外变量的消息

Msg's with extra variables in elm inputs

我正在尝试将 Elm (0.18) 中的 Msg 值划分为不同的类型。我希望它符合这种类型:

type MsgSession
    = LogIn
    | LogOut


type MsgSettings
    = SetUsername String
    = SetPassword String

type Msg
    = SessionMsg MsgSession
    | SettingsMsg MsgSettings
    ...

我的更新函数如下所示:

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        SessionMsg sessionMsg ->
            sessionUpdate sessionMsg model

        SettingsMsg settingsMsg ->
            settingsUpdate settingsMsg model
        ...

...这意味着我还必须定义子更新...

sessionUpdate : MsgSession -> Model -> ( Model, Cmd Msg )
sessionUpdate msg model =
    case msg of
        LogIn ->
            -- do stuff
        LogOut ->
            -- do stuff

我的注销事件看起来像这样,并且工作正常:

button [onClick (SessionMsg LogOut)] [text "Log Out"]

但是一旦事件涉及变量,就不行了。我对 settingsUpdate:

有类似的设置
settingsUpdate : MsgSettings -> Model -> ( Model, Cmd Msg )
settingsUpdate msg model =
    case msg of
        SetUsername string ->
           ...
        SetPassword string ->
           ...

但我无法让 onInput 作为变量发送。例如,这段代码

input [onInput SettingsMsg SetUsername] []

产生此错误:

Function `onInput` is expecting 1 argument, but was given 2.
483|                                   onInput SettingsMsg SetUsername

括号也不起作用。

input [onInput (SettingsMsg SetUsername)] []

产量

The argument to function `SettingsMsg` is causing a mismatch.
483|                                            SettingsMsg SetUsername)
                                                            ^^^^^^^^^^^
Function `SettingsMsg` is expecting the argument to be:
    MsgSettings
But it is:
    String -> MsgSettings

我必须将什么传递给 onInput 才能使这项工作正常进行?

你应该可以使用组合:

input [onInput (SettingsMsg << SetUsername)] []

如果您更习惯使用显式 lambda,则看起来像这样:

input [onInput (\name -> SettingsMsg (SetUsername name))] []