PureScript - 将 `launchAff_` 替换为 `launchAff`

PureScript - Replace `launchAff_` with `launchAff`

考虑以下工作代码示例,它使用 launchAff_ 复制 JSON 文件:

module Main where

import Prelude 
import Effect (Effect)
import Effect.Aff (Aff, launchAff_)
import Node.Encoding (Encoding(..))
import Node.FS.Aff (readTextFile, writeTextFile)
import Node.Path (FilePath)

duplicateCustomerData :: FilePath -> FilePath -> Aff Unit

duplicateCustomerData filePath1 filePath2 = do
  customer_data <- readTextFile UTF8 filePath1
  writeTextFile UTF8 filePath2 customer_data

main :: Effect Unit
main = launchAff_ do
  duplicateCustomerData "database/customer-1.json" "database/customer-2.json"

但是,如果将 main 函数更改为使用 launchAff(没有下划线),就像这样

main :: Effect Unit
main = launchAff do
  duplicateCustomerData "database/customer-1.json" "database/customer-2.json"

抛出以下错误:

  Could not match type
  
    Fiber Unit
  
  with type
        
    Unit

因此,

  1. 什么是 fiber unit
  2. 这个 fiber unit 的用例是什么?它意味着被丢弃吗?它代表什么?
  3. 为什么有两个 launchAff 函数?

Fiber表示一个运行异步计算。

FiberAff的区别在于“运行”部分。 Aff 不是 运行 的异步计算,而是一种启动异步计算的方法。在您将其绑定到更大的计算中之前,它不会启动。相反,您可以多次启动相同的 Aff

另一方面,

Fiber 是一个已经开始的异步计算,它已经在进行中。你可以通过 killFiber or you can wait for it to complete via joinFiber, and some other things. See the docs.

杀死它

现在我们知道 (1) Aff 是一种启动异步计算的方式,(2) Fiber 是一种 already-running 异步计算,它应该成为显然 Fiber 将是开始 Aff 结果 。这正是您所观察到的:launchAff 需要一个 Aff 并且 returns 需要一个 Fiber.

但有时(根据我自己的经验 - 大多数时候)我们实际上并不需要结果 Fiber。我们不会用它做任何事。对于这些情况,有一个方便的快捷方式 - launchAff_。它与 launchAff 做同样的事情,但丢弃了结果 Fiber。自己看看 in the source code.

在末尾添加下划线表示“returns unit”是一种常见的模式。比如有for and for_, there are traverse and traverse_, there are runAff and runAff_.