我从昨天开始读这段代码并试图找出合理的解释,请你检查一下我的假设是否正确。
此代码来自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这是一个很好的资源吗?
我已经阅读了有关信号的文档,但我无法真正理解这一点。用简单的英语解释一个例子将非常感谢,非常感谢任何能帮助我的人!
答案 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中,我们采取上述任务并将其转换为:
andThen
此结果类型将发送到results.address
。 实际发送到JS域执行的任务将没有错误(这就是你在那里看到x的原因)并且将导致Unit类型(这是Signal.send的签名)。
当任务在JS中实际执行时,执行结果将以results.address作为Result类型结束。