Обобщить функцию purescript, используя MonadAff

У меня есть вопрос об обобщении. Начиная с этой функции:

test0 :: String -> String
test0 s = s

мы можем обобщить это в аргументе:

test1 :: forall a. Show a => a -> String
test1 s = show s

или по своему функциональному результату:

test12 :: forall a. Show a => String -> a
test12 s = s

Теперь рассмотрим следующую функцию:

test2 :: forall e. Aff e Int
test2 s = pure 0

Я хотел бы обобщить его в функциональном результате:

test3 :: forall e m. MonadAff e m => m e Int
test3 s = pure 0

Однако теперь я получаю сообщение об ошибке: не удалось сопоставить тип вида с видом # Control.Monad.Eff.Effect при проверке типа MonadAff e m => m e Int в объявлении значения test3.

Я не могу понять почему. Более того, я нашел пример подобного такого обобщения в Hyper.Node.Server, например, в этом типе:

write :: forall m e. MonadAff e m => Buffer -> NodeResponse m e

1 ответ

Решение

Ограничение MonadAff e m утверждает, что монада m как-то заворачивает Aff e где-то внутри Но это не утверждает, что монада m сам должен иметь аргумент типа e, Это было бы ужасно ограничительно, не так ли?

Поэтому при построении вашего возвращаемого типа не применяйте m в e:

test3 :: forall e m. MonadAff e m => m Int
test3 = pure 0

Пример, который вы нашли, совсем другой. Здесь функция не возвращает значение в mкак в вашем test3, а скорее значение NodeResponse, который является оберткой вокруг функции, которая возвращаетm Unit,

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