我已经开始使用论文monad-transformers: Step by step了解有关monad变压器堆栈的信息。 有些代码有些过时了,但是经过一些细微的修改,我使它起作用了。 但是现在我偶然发现了一条我不完全理解的错误消息。
据我目前的理解,m :: *-> *是一种更高的类型 并且编译器希望它是一个变量,即m :: *。 但是我不知道如何编辑代码才能使它工作。
targetWindow.postMessage(message, targetOrigin, [transfer]);
答案 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中启用多个扩展是非常习惯的。可以说,其中许多应该默认启用。