Принуждение 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
Использование строк эффектов, подобных этому, может показаться не совсем правильным (и немного неудачным, так как делает ряды "шире", чем они должны быть в некоторых местах), но это избавляет от больших трудностей, когда все строки выстраиваются в линию.