Обобщить функцию 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
,