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

Elm:如何定义以消息为参数执行请求的函数,elm,Elm,在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

在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
不编译:

函数
map
的参数导致不匹配

124 | Cmd.m地图 ^ 函数
map
希望参数为:

a -> msg
但事实是:

msg
提示:函数似乎还需要一个参数

如果msg接受一个参数呢?例如:

|> Cmd.map (mymsg myParamTomymsg)

这导致我有很多代码重复,一定有更好的方法…

这个答案是假设您使用的是标准Http包编写的。如果您是Elm的新手,我建议您首先使用它,并使用开源软件包

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

mypost : String -> String -> (a -> msg) -> Cmd msg
必须明确指定类型,并用响应类型替换
a

更长的解释 换句话说,您必须明确地说,传递给的第一个参数是一个函数,它将响应映射到消息

定义联合类型时,
Msg
是新类型的名称,
NoOp
with
Update
是可以充当
Msg
类型值构造函数的实际值

type Msg
    = NoOp
    | Update String
通过在代码中使用
Update“Hello”
,我们创建了一个
Msg
类型的值,其中字符串
“Hello”
被标记为标签
Update
,除了标记值的类型预期为

Update
的类型暗示为
String->Msg

让我们看一下的类型注释定义

下面是一个例子

如果你正在使用 您必须修复类型定义批注:

myget1 : (WebData HttpBin -> msg) -> Cmd msg

我希望这能有所帮助。

谢谢,尽管我仍然无法让它工作,但我添加了这个无法编译的选项来更好地说明问题。@FranciscoDibar只是用
myget1:(WebData HttpBin->msg)->Cmd msg来替换类型注释定义,我没有意识到您使用的是Awesome!现在它可以工作了:)下一步是如何发送带有参数的消息(见问题的最后一部分)回答我自己的参数,即myget1:(Int->RemoteData.WebData HttpBin->msg)->Cmd msg
get : Int -> Difficulty -> (Result Error TriviaResult -> msg) -> Cmd msg
get amount difficulty msg =
    Http.get (triviaRequestUrl amount difficulty) decoder
        |> Http.send msg
myget1 : (WebData HttpBin -> msg) -> Cmd msg