gpt4 book ai didi

Elm:如何定义以消息为参数执行请求的函数

转载 作者:行者123 更新时间:2023-12-04 19:29:29 25 4
gpt4 key购买 nike

在 Elm 0.18 中,我如何定义一个执行请求的函数,它将 作为参数留言 接收响应时的更新功能?

以下代码:

mypost : String -> String -> msg -> Cmd msg
mypost url csrf mymsg =
Http.request
{ method = "POST"
, headers = [ Http.header "X-CSRFToken" csrf ]
, url = url
, body = Http.emptyBody
, expect = Http.expectJson mydecoder
, timeout = Nothing
, withCredentials = False
}
|> RemoteData.sendRequest
|> Cmd.map mymsg

不编译:

The argument to function map is causing a mismatch.

124| Cmd.map m ^ Function map is expecting the argument to be:

a -> msg

But it is:

msg

Hint: It looks like a function needs 1 more argument.



如果 msg 接受一个参数呢?例如:
|> Cmd.map (mymsg myParamTomymsg)

这导致我有很多代码重复,必须有更好的方法......

最佳答案

假设您使用的是标准 Http 包,则编写此答案。如果您是 Elm 的新手,我建议您先尝试使用它并使用开源包。

TL; 博士
mymsg的类型在您的代码中应该是 a -> msg , 其中类型变量 a与解码器产生的值类型相同 mydecoder

mypost : String -> String -> (a -> msg) -> Cmd msg

您必须明确指定类型并替换 a与响应类型。

更长的解释

换句话说,您必须明确说明第一个参数传递给 Http.send是一个函数,它将响应映射到消息。

当您定义联合类型时, Msg是您的新类型的名称和 NoOpUpdate是可以作为 Msg 的值的构造函数的实际值类型。
type Msg
= NoOp
| Update String

通过使用 Update "Hello"在代码中,我们创建了一个值 Msg类型,其中一个字符串 "Hello"被标记为标签 Update同样的事情发生在 Http.send ,除了标记值的类型应该是 Result.
Update的类型暗示为 String -> Msg
我们来看看 Http.send: 的类型注解定义
send : (Result Error a -> msg) -> Request a -> Cmd msg

这是一个 generic GET request: 的例子
get : Int -> Difficulty -> (Result Error TriviaResult -> msg) -> Cmd msg
get amount difficulty msg =
Http.get (triviaRequestUrl amount difficulty) decoder
|> Http.send msg

如果您使用的是 remotedata

您必须修复您的类型定义注释:
myget1 : (WebData HttpBin -> msg) -> Cmd msg

我希望这有帮助。

关于Elm:如何定义以消息为参数执行请求的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45897289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com