Elm:如何定义以消息为参数执行请求的函数
在Elm 0.18中,如何定义执行请求的函数,该函数在接收响应时将更新函数的消息作为参数 以下代码: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
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
withUpdate
是可以充当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