2016-02-19 88 views
0

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

此代码自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行定义的端口,是返回其通过Task组成Signal,通过x和空值所确定的种类(这并没有什么意义,我,我想这是完全错误的) 。

第4行和第5行使用了forward函数应用程序构造,所以第4行的结果作为参数传递给第5行,但是这些行中详细说明了什么?

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

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

回答

2

A port是榆树与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查询的结果,在结果类型结合在一起。 (这意味着新任务永远不会失败)。
  2. andThen此结果类型将发送到results.address

实际上在JS版本中执行的结果Task将没有错误(这就是为什么你会看到x的原因)并且将导致Unit类型(这是Signal.send的签名) 。

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

+0

比你*这么多! –