(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
结合了 e1
和 e2
.
的所有效果
我明白了。对于一般情况,我只需要具体说明每个 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
都有不同的显式效果。
我基本上需要知道如何编写这样的函数...
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
结合了 e1
和 e2
.
我明白了。对于一般情况,我只需要具体说明每个 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
都有不同的显式效果。