理解这个信号代码

Understanding this signal code

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

此代码来自here.

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

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

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

要了解函数式响应式编程,我正在阅读 this post 这是一个很好的资源吗?

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

A port 是 Elm 与 JS 世界沟通的方式。

Signal (Task x ()) 表示这是具有错误类型 x 和 return a Unit

的任务信号

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

如果我们查看 lookupZipCode 的定义,我们可以看到它需要一个 String 和 return 一个 Task String (List String)。查看它的代码,我可以看到它将对查询字符串执行一个 Http 请求,并且 return 一个字符串类型的错误或一个字符串列表(城镇名称列表)。

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

在接下来的Signal.map中,我们将上述任务转换为:

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

在 JS 领域实际发送执行的结果任务将没有错误(这就是为什么你在那里看到 x 的原因)并且会产生单元类型(这是 Signal.send 的签名).

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