haskell - Template Haskell 中准引号内的类型检查

标签 haskell types metaprogramming type-systems

我正在尝试熟悉 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/

相关文章:

c# - C# 中的最大整数类型

scala - 具有抽象类型成员的具体类

ruby - 你能在 Ruby 的核心模块类中添加一个类方法吗?

c++ - 基于条件的模板重载

haskell - 如何为Generic编写实例以派生类似零::a(即常量)的函数?

haskell - 函数类型的 Applicative 和 Monad 实例?

.net - 为什么 .Net 引用类型中有接口(interface)?

java - Groovy 中的克隆和扩展类

haskell - 为什么 Reader monad 存储一个函数?

function - Haskell调用函数onload