Elm:如何在调用 Http.post 时向 "expect" 的 Msg 发送额外的参数?

Elm: How can I send extra params to a Msg from "expect" when calling Http.post?

第一次尝试用Elm做APP。我需要使用 Http.post.

与服务器应用程序交互

我有这样的消息类型:

type Msg =
    …
    | Send (String, String)
    | Recv (String, String)

更新函数是这样的:

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
    case msg of
        …
        Send (name, data) ->
            (newModel, Http.post
                { url = url
                , body = Http.multipartBody [Http.stringPart "data" data]
                , expect = Http.expectString (Recv name)
                })
        Recv (name, data) -> … -- process data

但是当我 运行 这样做时,它会在 Http.post 中产生类型不匹配错误。 那么如何同时将 name 和 newData 传递给 Msg "Recv"?

您的类型构造函数 Recv 需要一个单独的参数,它是一个字符串元组。所以基本上 Recv : ( String, String ) -> Msg.

所以当你调用Recv name,其中name : String,你会得到一个类型错误。

这里有两种解决方案:

  1. 你把Recv的定义改成

    | Recv String String
    

    这意味着您现在可以部分应用 Recv 构造函数并返回一个函数 String -> Msg,这正是 Http.expectString 想要的。

  2. 您更改 expect 调用以获得正确的形状:

    , expect = Http.expectString (\body -> Recv ( name, body ))
    

    在这里你明确地创建了 Http.expectString 想要的功能。