(PureScript) 如何创建两个单独定义的效果行的联合

(PureScript) How to create a Union of two separately defined rows of effects

我基本上需要知道如何编写这样的函数...

joinCommands :: forall e1 e2 e3
   . Union e1 e2 e3
  => Eff e1 Unit
  -> Eff e2 Unit
  -> Eff e3 Unit
joinCommands fn1 fn2 = do
  fn1
  fn2

这是行不通的。我收到此错误:

[PureScript] Could not match kind

Control.Monad.Eff.Effect

with kind

Type

更具体地说,我想做的是组合两个用户提供的功能数组。这是代码库的一部分(用户提供)returns Array (Eff e1 Unit) 和另一部分(也是用户提供的)returns Array (Eff e2 Unit)。在应用程序的入口点(用户无法访问 "core"),这两个集合需要合并,以便它们可以 运行 在一起。所以真的,我正在尝试编写一个 Array (Eff e1 Unit) -> Array (Eff e2 Unit) -> Array (Eff e3 Unit) 类型的函数,其中 e3 结合了 e1e2.

的所有效果

我明白了。对于一般情况,我只需要具体说明每个 Eff 都有一个相互兼容的类型(不一定相同)。

joinCommands :: forall e. Eff e Unit -> Eff e Unit -> Eff e Unit
joinCommands fn1 fn2 = do
  fn1
  fn2

具体情况,答案是一样的。函数签名为 forall e. Array (Eff e Unit) -> Array (Eff e Unit) -> Array (Eff e Unit),编译器可以计算出第一组 Effs 与第二组兼容。

所以如果你有...

type Commands e = Array (Eff e Unit)
a :: forall e. Commands (random :: RANDOM | e)
a = []

b :: forall e. Commands (now :: NOW | e)
b = []

c :: forall e. Commands e -> Commands e -> Commands e
c = a <> b

...您可以调用 c a b,即使 ab 都有不同的显式效果。