考虑这段代码:
魔术 :: String -> Q Exp 魔法 s = [e| putStrLn s |]
现在,据我所知,这实际上是行不通的。在牛津括号内,s
不在范围内。然而,上述显然是完美的。
如果我们稍微改变一下这个例子,它现在会很糟糕:
魔法 :: Exp -> Q Exp 魔法 (VarE n) = [e| putStrLn (nameBase n) |]
就像以前一样,我们有一个不在范围内的变量。而这一次,它打破了。但它不会抱怨不在范围内的变量;相反,它抱怨一些缺少实例的无证类。
有谁知道这到底是怎么回事?