理解这个信号代码

时间:2016-02-19 22:04:33

标签: elm elm-signal

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

此代码来自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行定义了一个端口,返回一个由Signal组成的Task,一个由x标识的类型和一个空值(这对我来说没有意义,我认为这是完全错误的。)

第4行和第5行使用正向函数应用程序构造,因此第4行的结果作为参数传递给第5行,但这些行中有详细的内容吗?

要了解功能性反应式编程,我正在通过this post这是一个很好的资源吗?

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

1 个答案:

答案 0 :(得分:2)

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

Signal (Task x ())表示这是任务的信号,其错误类型为x并返回Unit

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

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

因此Signal.map lookupZipCode query.signal会生成一个询问邮政编码服务器的信号。

在下一个Signal.map中,我们采取上述任务并将其转换为:

  1. 错误和http查询的结果在Result类型中连接在一起。 (这意味着新任务永远不会失败)。
  2. andThen此结果类型将发送到results.address
  3. 实际发送到JS域执行的任务将没有错误(这就是你在那里看到x的原因)并且将导致Unit类型(这是Signal.send的签名)。

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