Принуждение Eff или Aff удовлетворяет функцию, ожидающую больший набор эффектов

У меня есть эффективное асинхронное действие с типом, скажем,

effectful :: Aff e r

Я хотел бы создать действие, которое выполняет некоторое асинхронное действие и отправляет результат Channel из purescript-сигнала. send функция имеет подпись:

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)

Типы не объединяются здесь между e а также channel :: CHANNEL | e,

Как мне конвертировать значение типа Aff e a в Aff (channel :: CHANNEL | e) a, или по крайней мере Eff e a в Eff (channel :: CHANNEL | e) a?

1 ответ

При использовании строк эффектов, как правило, лучше использовать одну и ту же строку везде, даже если эффекты не являются "обязательными" в каждом месте. Так что в этом случае тип для Aff аргумент должен включать channel тоже:

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

Использование строк эффектов, подобных этому, может показаться не совсем правильным (и немного неудачным, так как делает ряды "шире", чем они должны быть в некоторых местах), но это избавляет от больших трудностей, когда все строки выстраиваются в линию.

Другие вопросы по тегам