榆树在更新时在列表中添加项目

mfr*_*het 4 list elm

我试图理解Elm lang,我在处理我的小应用程序的更新部分时遇到了一些问题.

实际上,我希望当我点击一个按钮时,它会在列表中添加一个新用户,这个东西非常简单,没有任何意义,但我需要理解.

现在,我有以下代码:

main =
  Html.beginnerProgram { model = model, view = view, update = update }

type Msg = AddUser
type alias User =
    {
        username : String,
        firstname: String,
        lastname: String
    }

model: List User
model =
    []

update: Msg -> User -> List User -> List User
update msg user userList =
    case msg of
        AddUser ->
            user::userList
Run Code Online (Sandbox Code Playgroud)

我有以下错误:

-- TYPE MISMATCH ------------------------------------------------------ main.elm

The argument to function `beginnerProgram` is causing a mismatch.

5|   Html.beginnerProgram { model = model, view = view, update = update }
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Function `beginnerProgram` is expecting the argument to be:

    { ..., update : Msg -> List User -> List User }

But it is:

    { ..., update : Msg -> User -> List User -> List User }

Hint: Problem in the `update` field. I always figure out field types in
alphabetical order. If a field seems fine, I assume it is "correct" in
subsequent checks. So the problem may actually be a weird interaction with
previous fields.
Run Code Online (Sandbox Code Playgroud)

事实上,我目前从更新功能中理解的是:

  • 在第一个返回接受用户的函数的函数中获取一个消息
  • 此函数(接受用户)返回接受用户列表的函数(使操作user :: userList)
  • 最后一个函数返回一个用户列表,我完成了

但在这种情况下我无法理解错误.

你能帮助我吗 ?

far*_*mio 8

Html.beginnerProgram期望更新函数是类型的Msg-> Model -> Model(您的Model被命名为"User",这没有问题).您要添加的用户属于"AddUser"联合类型.

type Msg = AddUser User
Run Code Online (Sandbox Code Playgroud)

这意味着您将新用户与Msg一起传递(因此您可以使用传递不同内容的不同消息).要获得新用户,您可以在"案例"中进行模式匹配

case msg of
    AddUser newUser ->
        newUser :: userList
Run Code Online (Sandbox Code Playgroud)