- 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/
我将多阶段Dockerfile与阶段Build和Start一起使用,如下所示:。我想知道,在Start阶段,我是否需要再次执行Copy--from=Build<...。换句话说,是不是开始重用文件系统
我将多阶段Dockerfile与阶段Build和Start一起使用,如下所示:。我想知道,在Start阶段,我是否需要再次执行Copy--from=Build<...。换句话说,是不是开始重用文件系统
我的作业配置如下,我正在尝试对我的 hadoop 作业进行简单的两步链接, public int run(String[] args) throws Exception { Confi
我正在尝试编写一个简单的方法来切换我的窗口是否最小化(即图标化)。我有奇怪的行为。下面是说明问题的可运行代码。 我在 Gnome 3.20.4 和 XFCE 4.12 上得到了相同的结果。我还没有在任
在 ActionScript 3 (as3) 中 调用 stage.width 和 stage.stageWidth 有什么区别 这是我记得我过去很困惑的事情(Adobe 的 api 文档是一种混淆的
我在新的 Java SDK 11 中基于 this 创建了项目示例: EntryPoint.java package com.example; import javafx.stage.Stage; i
两年半前,Adobe宣布FlashPlayer 10将支持色彩校正。不可否认,该实现实际上是最基本的,因为它将始终假定所有内容均为sRGB编码,并将该内容转换为系统上正在使用的当前显示配置文件。 Th
在as3中调用stage.width和stage.stageWidth有什么区别 我在某处读到,如果舞台上什么都没有,那么 stage.width 的值为 0,但是当我在舞台上什么都没有但在舞台上动态
当我暂存至少一个跟踪文件时,以下 block 起作用。但是当我只暂存未跟踪的文件时,repo.RetrieveStatus().Staged.Count 等于零(我希望它会随着暂存文件的数量增加),因
作为两者 node步和stage步骤提供范围{}语法,在 groovy 代码中定义拓扑的最佳实践是什么? 附件A node ("NodeName") { stage ("a stage ins
我尝试关注 these fairly simple instructions for integrating Static Application Security Testing (SAST)进入我
我尝试关注 these fairly simple instructions for integrating Static Application Security Testing (SAST)进入我
我有一个主舞台,想创建多个额外的舞台 (Windows)。这些就像 Photoshop 中控制主舞台的调色板,但我想要具有标题栏、调整大小和能够将它们拖动到多个监视器上的任何位置的功能(Popup 类
我正在尝试将下面代码中的字符串显示到其他类中的 Pane 。 public WebEngine helloWebEngine(Stage stage) { WebView wv = getWe
package { import flash.display.Stage; public class MyGlobal { public static var CX:Number =
根据我的标题,我的 jenkins 设置收到以下错误: Unknown stage section "stage". Starting with version 0.5, steps in a sta
当您在 ASP.NET Core 站点上的 Visual Studio 中单击“添加 Docker 支持”时,这是默认的多阶段 Dockerfile。 FROM microsoft/aspnetcor
我的问题是:babel-preset-stage-0 之间有什么区别? , babel-preset-stage-1 , babel-preset-stage-2和 babel-preset-stag
我最近对有关“新式”JavaScript 的文章中的以下术语感到困惑: ES6 ES7(有时,尽管很少,ES8 和更大版本) ES2015(有时是 ES2016 及更高版本) 第 0 阶段(和第 1
2014-04-04 16:02:31.633 java[44631:1903] Unable to load realm info from SCDynamicStore 14/04/04 16:0
我是一名优秀的程序员,十分优秀!