【问题标题】:generalize purescript function using MonadAff使用 MonadAff 泛化纯脚本函数
【发布时间】:2018-02-25 14:41:59
【问题描述】:

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

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

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

我不明白为什么。此外,我在 Hyper.Node.Server 中找到了一个类似的泛化示例,例如这种类型:

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

【问题讨论】:

    标签: purescript


    【解决方案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,即wrapper around a function that returns m Unit

    【讨论】:

    • 我明白了。谢谢!但是,我发现结果表达式仍然不行。该类型不描述功能参数。仅当我将其更改为 test3 :: forall e m 时。 MonadAff e m => Int -> m Int 编译器接受它。
    • test3 不需要接受参数,如果您想将其键入为 m Int - 它应该只是 test3 = pure 0
    • 非常正确,@gb。但是,我只想指出,我的原始表达式包含两个错误,而不仅仅是一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多