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在引用的表达式中使用几种类型的值 - 具有实例的值 - 并且它们将自动转换为适当的代码以在另一端重新创建相应的值.
例如,s的Lift实例Integer只是构造相应的整数文字,而实例Maybe只是构造相应的构造函数应用程序.您甚至可以定义自己的实例Lift.
你得到一个"无实例"的错误,因为它n是一个Name无法Lift实现的错误.
| 归档时间: |
|
| 查看次数: |
299 次 |
| 最近记录: |