Coerce Eff或Aff以满足期望更大效果的功能

时间:2017-10-01 08:42:42

标签: purescript

我对一个类型进行了有效的异步操作,比如说,

effectful :: Aff e r

我想构建一个采取一些异步操作的操作,并将结果从purescript-signal发送到Channelsend函数具有签名:

send :: forall a e. Channel a -> a -> Eff (channel :: CHANNEL | e) Unit

以下是我提出的实施方案:

runAffToChannel :: forall a e. Channel a
                -> Aff e a
                -> Eff (channel :: CHANNEL | e) Unit
runAffToChannel chan = runAff_ $ either ignore $ send chan
  where
    ignore = const (pure unit)

echannel :: CHANNEL | e之间的类型不统一。

如何将Aff e a类型的值转换为Aff (channel :: CHANNEL | e) a,或至少Eff e a转换为Eff (channel :: CHANNEL | e) a

1 个答案:

答案 0 :(得分:2)

使用效果行时,通常最好在任何地方使用相同的行,即使效果不是必需的"在每个地方。因此,在这种情况下,Aff参数的类型也应包括channel

runAffToChannel :: forall a e. Channel a
                -> Aff (channel :: CHANNEL | e) a
                -> Eff (channel :: CHANNEL | e) Unit

使用像这样的效果行可能看起来不太合适(并且有点不幸,因为它使行和#34;比他们需要在某些地方更宽),但它可以节省很多痛苦使行全部排成一行。