Elm 错误处理和信号

Elm 错误处理和信号,elm,Elm,我有一个Elm应用程序,需要在Elm平台0.14.1上使用Http与服务器通信。在将请求发送到服务器之前,应用程序需要验证其请求是否有效 目前,我正在使用函数makeRequest从模型中获取一些数据,并基于它生成Http.Request,无效请求返回Http.get”“。这是一个黑客,我想用正确的错误处理来代替它 我拥有的功能类型有: makeRequest : List String -> Request String Http.send : Signal (Request a) -&

我有一个Elm应用程序,需要在Elm平台0.14.1上使用
Http
与服务器通信。在将请求发送到服务器之前,应用程序需要验证其请求是否有效

目前,我正在使用函数
makeRequest
从模型中获取一些数据,并基于它生成
Http.Request
,无效请求返回
Http.get”“
。这是一个黑客,我想用正确的错误处理来代替它

我拥有的功能类型有:

makeRequest : List String -> Request String
Http.send : Signal (Request a) -> Signal (Response String)
我想将
makeRequest
的结果包装在
result
中,以便正确处理错误。我还想包装
Http.send
,以便它传播错误

理想情况下,我希望以以下方式结束:

newMakeRequest : List String -> Result String (Request String)
newSend : Signal (Result String (Request a)) -> Signal (Result String (Response String))

构造
newMakeRequest
是很简单的。但是我不知道如何接近
newSend
,或者这是否可能。

好的,那么你所需要的就是
newSend
对吗?这是可能的:

newSend : Result x (Reponse a) -> Signal (Result x (Request a)) -> Signal (Result x (Response a))
newSend defaultResp s =
  let reqs =
        s |> Signal.keepIf isOk (Ok (Http.get ""))
          |> Signal.map unpackOk
      errs =
        s |> Signal.dropIf isOk defaultResp
          |> Signal.map errIdentity
  in Signal.merge errs (Signal.map Ok (Http.send reqs))

-- Change the type of an Err Result. 
errIdentity : Result x a -> Result x b
errIdentity =
  Result.map (Debug.crash "errIdentity: Don't call this function on an Ok!")

unpackOk : Result x a -> a
unpackOk =
  case res of
    Ok  a -> a
    Err x -> Debug.crash "unpackOk: Don't call this function on an Err!"

isOk : Result x a -> Bool
isOk res =
  case res of
    Ok  _ -> True
    Err _ -> False

我不确定您是否可以摆脱默认响应。我有点担心事件的顺序。。响应是异步的,因此当
Ok
请求仍然挂起时,您可能会立即从输出信号的输入信号中获得
Err
s。我不知道如何解决这个问题。我也不确定这对你来说是否是个问题

类型不是:
newMakeRequest:List String->Result error(Request String)
newSend:Signal(Result error(Request a))->Signal(Result error(Response String))
?很抱歉,这是个打字错误