作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想定义一个导出类 C
的 Haskell 模块和 C
的实例对于各种类型。因为我想定义很多可以按照给定方案自动定义的实例,所以我定义了一个辅助 TH 函数来定义实例,有点像这样:
module Foo (C) where
class C a
defineCInstance :: TypeQ -> DecsQ
defineCInstance t =
[d|
instance C $t
|]
defineCInstance [t| () |]
defineCInstance [t| Char |]
defineCInstance [t| Int |]
defineCInstance
在定义它的同一模块中的拼接中。这可以通过移动
defineCInstance
来修复进入一个新模块(我们称之为
Foo.Internal
)并将其导入
Foo
.但是,当我只是移动
defineCInstance
进入另一个模块它不会有
C
在范围内,我目前看到了两种解决此问题的方法。
C
进入
Foo.Internal
以及
defineCInstance
和
C
进入
Foo.Internal
defineCInstance
可以轻松引用
C
我可以拼接
defineCInstance
在
Foo
没有问题。但是,
Foo
中定义的实例不会在与
C
相同的模块中定义不再,因此成为孤儿实例。我想避免这种情况,因为那样我将不得不对孤儿的警告静音,这对于整个文件来说是 AFAIK 唯一可能的,并且可能会对同一文件中的其他意外孤儿实例的警告静音。我还注意到 haddock 然后将所有实例列为文档中的孤立实例,我也想避免这种情况。
defineCInstance
引用
C
直接地。
instance C
里面
defineCInstance
我可以使用
instance $(conT $ mkName "C")
之类的东西反而。然而,这隐藏了
C
之间的依赖关系。和
defineCInstance
来自编译器,这使得错误更有可能发生。例如,如果我重命名
C
,但忘记在
defineCInstance
中更改名称编译器仍然会愉快地编译
defineCInstance
.更糟糕的是,它依赖于正确的
C
在
defineCInstance
的拼接位点范围内.如果用户有错误
C
在范围内,生成的代码将完全没有意义。
C
,
defineCInstance
以及
C
的实例在某种程度上,仍然允许引用
C
直接来自
defineCInstance
和 避免定义孤儿实例?
最佳答案
defineCInstance_
这需要 Name
的 C
作为参数; Foo
包含类的模块,使用 defineCInstance_ ''Foo.C
对于标准实例; defineCInstance = defineCInstance_ ''Foo.C
,防止用户使用错误的名称。 ''Foo.C
两次命名:一次在拼接中,一次在导出的
defineCInstance
中.
关于haskell - 使用模板 haskell 定义实例时避免孤立实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60641765/
如果数据很大,我正在使用 orphan 属性在打印时添加分页符它在 chrome 和 IE 中工作但在 FireFox 中不支持. docprint.document.write('
如果我从“Default.aspx”等进行 AJAX PageMethod 或 WebMethod 调用,然后在初始 PageMethod 返回之前快速导航到另一个页面(例如“Settings.asp
我是一名优秀的程序员,十分优秀!