我第一次尝试在 Elm 中创建一个应用程序。我需要使用 Http.post 与服务器应用程序交互。
\n我有这样的消息类型:
\ntype Msg =\n \xe2\x80\xa6\n | Send (String, String)\n | Recv (String, String)\n
Run Code Online (Sandbox Code Playgroud)\n更新函数是这样的:
\nupdate : Msg -> Model -> (Model, Cmd Msg)\nupdate msg model =\n case msg of\n \xe2\x80\xa6\n Send (name, data) ->\n (newModel, Http.post\n { url = url\n , body = Http.multipartBody [Http.stringPart "data" data]\n , expect = Http.expectString (Recv name)\n })\n Recv (name, data) -> \xe2\x80\xa6 -- process data\n\n
Run Code Online (Sandbox Code Playgroud)\n但是当我运行它时,它会在 Http.post 中产生类型不匹配错误。\n那么如何将 name 和 newData 同时传递给 Msg“Recv”?
\n您的类型构造函数Recv
需要一个参数,它是一个字符串元组。所以本质上Recv : ( String, String ) -> Msg
。
因此,当您调用Recv name
, where时name : String
,您将收到类型错误。
这里有两种解决方案:
你改变了的定义Recv
是
| Recv String String
Run Code Online (Sandbox Code Playgroud)
现在这意味着您可以部分应用Recv
构造函数并返回一个函数String -> Msg
,这正是我们Http.expectString
想要的。
您更改期望调用以获得正确的形状:
, expect = Http.expectString (\body -> Recv ( name, body ))
Run Code Online (Sandbox Code Playgroud)
在这里,您明确地创建了所需的功能Http.expectString
。