使用MonadAff概括purescript函数

时间:2018-02-25 14:42:00

标签: purescript

我有一个关于概括的问题。从这个函数开始:

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

但是,我现在收到一个错误: 在检查MonadAff e m =>的种类时,无法将类型与种类#Control.Monad.Eff.Effect匹配。 m e Int in value declaration test3。

我无法理解为什么。此外,我在Hyper.Node.Server中找到了类似此类泛化的示例,例如此类型:

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

1 个答案:

答案 0 :(得分:1)

约束MonadAff e m断言monad m以某种方式将Aff e包裹在内部。但它并没有断言monad m本身必须有一个类型参数e。这将是非常严格的限制,不是吗?

因此,在构建退货类型时,请不要将m应用于e

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

您找到的示例完全不同。此处,该函数未在m中返回值,就像在test3中一样,而是返回值为NodeResponse的值if