为什么这个模板Haskell有效?

Mat*_*hid 4 haskell template-haskell

考虑以下代码:

magic :: String -> Q Exp
magic s = [e| putStrLn s |]

现在,尽我所知,这实际上不应该起作用.在牛津括号内,s不在范围内.然而,上述显然完美无缺.

如果我们稍微改变这个例子,它现在可怕地破坏了:

magic :: Exp -> Q Exp
magic (VarE n) = [e| putStrLn (nameBase n) |]

就像以前一样,我们有一个不在范围内的变量.而一次,它打破了.但它没有抱怨不在范围内的变量; 相反,它抱怨一些没有实例的无证件类.

谁知道到底发生了什么?

ehi*_*ird 12

s 在牛津括号内的范围.基本上,您可以Lift在引用的表达式中使用几种类型的值 - 具有实例的值 - 并且它们将自动转换为适当的代码以在另一端重新创建相应的值.

例如,sLift实例Integer只是构造相应的整数文字,而实例Maybe只是构造相应的构造函数应用程序.您甚至可以定义自己的实例Lift.

你得到一个"无实例"的错误,因为它n是一个Name无法Lift实现的错误.