0

我从昨天开始阅读这段代码并试图提出一个合理的解释,请您检查我的假设是否正确。

这段代码来自这里

port requests : Signal (Task x ())
port requests =
  Signal.map lookupZipCode query.signal
    |> Signal.map (\task -> Task.toResult task `andThen` Signal.send results.address)

第 1 行定义了一个端口,返回Signal由 a 组成的 a Task,由 a 标识的类型x和一个空值(这对我来说没有意义,我想这是完全错误的)。

第 4 行和第 5 行使用了前向函数应用程序构造,因此第 4 行的结果作为参数传递给第 5 行,但是在这些行中详细发生了什么?

要了解功能反应式编程,我正在阅读这篇文章,这是一个很好的资源吗?

我已经阅读了有关信号的文档,但在这里我无法真正理解这一点。非常感谢用简单的英语解释一个例子,非常感谢任何帮助我的人!

4

1 回答 1

2

Aport是 Elm 与 JS 世界交流的方式。

Signal (Task x ())表示这是具有错误类型x并返回Unit的 Task 信号

第二行定义了端口,它基本上意味着这个端口将用于与 JS 的通信,而不是来自 JS 的通信。

如果我们查看 的定义,lookupZipCode我们可以看到它接受 aString并返回 a Task String (List String)。查看它的代码,我可以看到它将在查询字符串上执行一个 Http 请求,并返回一个字符串类型的错误或一个字符串列表(城镇名称列表)。

因此Signal.map lookupZipCode query.signal产生了询问邮政编码服务器的这些任务的信号。

在下一个 Signal.map 中,我们执行上述任务并将它们转换为:

  1. http 查询的错误和结果以 Result 类型连接在一起。(这意味着新任务永远不会失败)。
  2. andThen此 Result 类型将被发送到results.address.

实际发送到 JS 中执行的结果任务不会有错误(这就是您在那里看到 x 的原因),并且会产生 Unit 类型(这是 Signal.send 的签名)。

当 Task 在 JS 中实际执行时,执行结果将作为 Result 类型在 results.address 中结束。

于 2016-02-20T08:49:32.923 回答