- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在模块中有以下代码:
{-# LANGUAGE TemplateHaskell #-}
module Alpha where
import Language.Haskell.TH
import Data.List
data Alpha = Alpha { name :: String, value :: Int } deriving (Show)
findName n = find ((== n) . name)
findx obj = sequence [valD pat bod []]
where
nam = name obj
pat = varP (mkName $ "find" ++ nam)
bod = normalB [| findName nam |]
{-# LANGUAGE TemplateHaskell #-}
import Alpha
one = Alpha "One" 1
two = Alpha "Two" 2
three = Alpha "Three" 3
xs = [one, two , three]
findOne = findName "One"
findTwo = findName "Two"
$(findx three) -- This Fails
$(findx (Alpha "Four" 4)) -- This Works
main = putStrLn "Done"
$(findx three)
创建
findThree = findName "Three"
为了我。但相反,我收到了这个错误:
GHC stage restriction: `three'
is used in a top-level splice or annotation,
and must be imported, not defined locally
In the first argument of `findx', namely `three'
In the expression: findx three
one
,
two
等在一个单独的文件中。
$(findx (Alpha "Four" 4))
工作没有问题?
最佳答案
我自己对 Template Haskell 不是很了解,但根据我有限的理解,问题是当 GHC 尝试编译 three
时 $(findx three)
在某种意义上“仍在定义中”,而 $(findx (Alpha "Four" 4))
的所有组件都已经完全定义。
根本问题是同一个模块 中的所有定义都会影响彼此 的含义。这是由于类型推断和相互递归。 x = []
的定义可能意味着很多不同的东西,具体取决于上下文;它可以将 x
绑定(bind)到 Int
列表或 IO ()
列表或其他任何内容。 GHC 可能必须处理整个模块才能准确确定它的含义(或者它实际上是一个错误)。
该分析必须考虑 Template Haskell 发出到正在编译的模块中的代码。这意味着必须在 GHC 弄清楚模块中定义的含义之前运行 Template Haskell 代码,因此从逻辑上讲,您不能使用它们中的任何一个。
当 GHC 编译该模块时,已经完全检查了从其他模块 OTOH 导入的内容。通过编译此模块,无需了解更多关于它们的信息。所以这些可以在编译这个模块中的代码之前访问和使用。
另一种思考方式:也许 three
实际上不应该是 Alpha
类型。也许这是一个错字,构造函数应该是 Alphz
。通常,GHC 会通过编译模块中使用 three
的所有其他代码来发现这些错误,以查看这是否会引入不一致。但是,如果该代码使用或被仅由 $(findx three)
发出的东西使用怎么办?在我们运行之前,我们甚至都不知道会是什么代码,但是直到我们运行它之后,我们才能解决 three
是否正确输入的问题。
在某些情况下,当然可以稍微取消这个限制(我不知道这是否容易或实用)。也许我们可以让 GHC 将某些东西视为“早期定义”,如果它是导入的,或者它只使用“早期定义”的其他东西(并且可能具有显式类型签名)。也许它可以尝试在不运行 TH 代码的情况下编译模块,并且如果它在遇到任何错误之前设法对 three
进行完全类型检查,它可以将其输入到 TH 代码中,然后重新编译所有内容。不利的一面(除了所涉及的工作)将使说明您可以传递给 Template Haskell 的确切限制是什么变得更加复杂。
关于haskell - 模板 Haskell : GHC stage restriction and how to overcome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16348183/
runghc 和 ghc 有什么区别? 我运行了一个简短的程序,似乎可以用两者编译,除了我用 runghc 得到了以下内容,但不是普通的 ghc: error: Variable not in sco
如果 friend 想要运行我的 Haskell 二进制文件,他是否必须先安装 Haskell,还是可以立即自行运行二进制文件? Mac、Windows 和 Linux 上的答案相同吗? 最佳答案 G
ffunction glMultiDrawElements 需要一个指向指针的指针作为其参数之一。如何从 StorableArray Int a 获取 Ptr(Ptr a) ? 最佳答案 您需要先将索
module Has (r,p,s) where import Prelude ((==),Bool(..),otherwise,(||),Eq) import qualified Data.List
我已经构建了 ghc-HEAD,我想尝试构建所有的 stackage lts 或 nightly 看看它能做多少。 无论我说什么都无法说服 stack 使用我的新 ghc 构建任何东西。我尝试设置如下
我正在使用 Emacs (24.3.1) 在 haskell-mode 中与 ghc-mod 一起使用 Haskell。 现在除了一件烦人的事情外,一切都很好: GHC 信息缓冲区中的每个输出仅包含第
为什么升级到 OSX Mavericks 后我的 GHC 7.6.3 不能工作? 最佳答案 花了很长时间才弄清楚如何同时使用 OSX 10.9 和 GHC 7.6.3,这里有一些技巧可以帮助您重新构建
我有一个带有 cabal 文件的主要 Haskell 可执行程序。在那里,我指定 ghc-options . 这个可执行文件链接到野外的其他库。请问ghc-options忽略这些库的 cabal 文件
我有一个使用 -Wall 编译的库,并且我有一个使用 -Wall -Wno-incomplete-patterns 的测试套件 当我使用 stack ghci --test 启动 ghci 时,ghc
我正在尝试使用以下脚本在 Windows 上安装 GHC(并将 ghc 放在路径中),但是当我尝试运行 ghci --version 时它失败了。我认为脚本有问题。 install: - ps:
我在 $HOME 中安装了 ghc-7.2.2 unknown linux tar.bz2在archlinux上。 在使用 cabal-dev 成功安装多个软件包后,尝试安装例如。我得到的解析数字、文
想法 我正在写 DSL ,编译为 Haskell。 该语言的用户可以定义自己的不可变数据结构和相关函数。关联函数是指属于数据结构的函数。 例如,用户可以编写(在“pythonic”伪代码中): dat
(我的问题是在没有 haskell-platform、ghc、cabal 等的情况下分发二进制文件) 我需要部署一个结构良好的 haskell 应用程序(Yesod 脚手架),但我有磁盘空间限制。 G
我试图将 Cygwin 安装程序指向 http://haskell.org/ghc/cygwin ,但安装程序无法找到 setup.ini.sig。如果可能的话,我该如何编辑我的 .bashrc 以引
我有一个现有的 Haskell 函数,它使用 GHC API 从模块中动态加载已编译的代码。它基于博客文章中的代码 Dynamic Compilation and Loading of Modules
我使用:Ubuntu 上的 GHC 7.6.3(通过 apt-get install haskell-platform) 从当前存储库安装它。 正在尝试安装ghc-mod ,因为我的 ide 插件需要
AFAIK,有两种方法可以在 Haskell 中获取用于调试的调用堆栈: 添加 HasCallStack代码中的约束 使用 ghc -prof -fprof-auto-top 编译代码 我的测试代码:
我想用 64 位 GHC 构建 32 位 DLL。这是最小的例子。 测试.hs {-# LANGUAGE ForeignFunctionInterface #-} module Test where
ghc-gc-tune 0.2.1 可以与 ghc 7.4.1 一起使用吗?看来 ghc-gc-tune 已经有一段时间没有更新了,可能只适用于 ghc 6.x?我找不到任何可靠的信息。 我收到以下错
语言扩展 ExplicitForall 使得使用 forall 绑定(bind)类型变量成为可能但不是必需的。 例如,下面的程序可以编译 {-# LANGUAGE ExplicitForAll #-}
我是一名优秀的程序员,十分优秀!