Elm在更新时如何向列表中添加项目

4

我正在尝试了解Elm语言,并且在处理我的小应用程序的更新部分时遇到了一些问题。

实际上,当我点击一个按钮时,我希望它将一个新用户添加到列表中,这是一件非常简单且没有任何意义的事情,但我需要理解。

现在,我的代码如下:

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

我遇到了以下错误:

-- 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.

实际上,我目前从更新函数中理解的是:

  • 在第一个函数中接收一条消息,返回一个接受用户的函数
  • 该函数(接受用户)返回一个接受用户列表的函数(使操作 user::userList)
  • 最后一个函数返回一个用户列表,然后就完成了

但是我无法确定自己在这种情况下错在哪里。

你能帮我吗?

1个回答

8

Html.beginnerProgram期望更新函数的类型是Msg-> Model -> Model(您的Model名称为“User”,这没有问题)。您想要添加的User属于“AddUser”联合类型。

type Msg = AddUser User

这意味着您可以将新用户与消息一起传递(因此您可以通过传递不同的内容来使用不同的消息)。要获取新用户,您可以在"case"中进行模式匹配。

case msg of
    AddUser newUser ->
        newUser :: userList

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接