我正在尝试熟悉 Template Haskell ,令我惊讶的是,下面的代码在 ghc
(版本 6.10.4)下编译。
main = do let y = [| "hello" + 1 |] putStr ""
这向我表明准引号内没有类型检查。这不是我阅读原著后所期望的paper关于 Haskell 模板。此外,以下程序无法编译。
main = do let y = [| "hello" && True |] putStr ""
这是怎么回事?
最佳答案
看起来 GHC 确实对所有引用进行了类型检查但是假设所有生成的实例约束都可以得到满足。
在此代码中:
main = do
let
y = [| "hello" + 1 |]
putStr ""
假设我们有一个 Num String 实例,y 括号是可输入的。由于 GHC 无法确定在 y 拼接之前不会引入这样的实例,因此它不会给出类型错误。
在此代码中:
main = do
let
y = [| "hello" && True |]
putStr ""
无论您设置什么实例环境,都无法成功拼接 y。
这只是 Template Haskell 的类型检查机制过于宽松的一个例子 - Simon PJ 的博客文章 http://hackage.haskell.org/trac/ghc/blog/Template%20Haskell%20Proposal 中讨论了更多示例。 ,他建议进行更改,根本不键入检查任何引文。
关于haskell - Template Haskell 中准引号内的类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365746/