我有一个关于概括的问题。从这个函数开始:
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
答案 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
。