0

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

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] 无法匹配种类

Control.Monad.Eff.Effect

和善

Type

更具体地说,我想做的是结合两个用户提供的功能数组。这是代码库的一部分(用户提供)返回Array (Eff e1 Unit),另一部分(也是用户提供)返回Array (Eff e2 Unit)。在应用程序的入口点(用户无法访问的“核心”)这两个集合需要组合起来,以便它们可以一起运行。所以真的,我正在尝试编写一个类型的函数,Array (Eff e1 Unit) -> Array (Eff e2 Unit) -> Array (Eff e3 Unit)将ande3的所有效果结合起来。e1e2

4

1 回答 1

0

我想到了。对于一般情况,我只需要具体说明每个 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...即使两者都有不同的显式效果a,您也可以调用。b

于 2017-07-06T19:26:52.233 回答