Monad Transformer堆栈收到非类型变量参数错误

时间:2018-12-31 13:18:38

标签: haskell functional-programming monads monad-transformers

我已经开始使用论文monad-transformers: Step by step了解有关monad变压器堆栈的信息。 有些代码有些过时了,但是经过一些细微的修改,我使它起作用了。 但是现在我偶然发现了一条我不完全理解的错误消息。

error msg

据我目前的理解,m :: *-> *是一种更高的类型 并且编译器希望它是一个变量,即m :: *。 但是我不知道如何编辑代码才能使它工作。

targetWindow.postMessage(message, targetOrigin, [transfer]);

2 个答案:

答案 0 :(得分:2)

您的代码中有一个错字,您在某些地方写了evel3而不是eval3

evel3 :: Exp -> Eval3 Value
evel3 ... = ...
eval3 ... = ...

这使GHC相信这是两个不同的定义

-- One definition
evel3 :: Exp -> Eval3 Value
evel3 ...  = ...

-- Another definition, without a signature
eval3 ... = ...

GHC拒绝eval3的推断类型,该推断类型比Exp -> Eval3 Value更通用,因为它不符合chi的解释。

答案 1 :(得分:1)

默认情况下,GHC使用2010年Haskell报告中定义的基本Haskell语言。

最现代的Haskell代码不符合该标准,但是利用了几个扩展。

在这种情况下,您需要启用FlexibleContexts扩展名,如GHC在错误消息中建议的那样。 在代码的最顶部添加以下行:

{-# LANGUAGE FlexibleContexts #-}

实际上,在现代Haskell中启用多个扩展是非常习惯的。可以说,其中许多应该默认启用。