作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如:
let context = sequence [classP (mkName "Eq") [varT (mkName "a")]]
in
[d| instance $(context) => Bar (Foo a) where
quux _ = undefined
|]
我想要的结果是 instance Eq a => Bar (Foo a) where quux _ = undefined
,但是,Template Haskell 正确地提示 context
有类型 Q Cxt
而不是预期的 Q Type
。
有没有一种方法可以指定实例声明的约束,而不必直接使用构造函数InstanceD
?
最佳答案
我认为 Template Haskell 目前不直接支持拼接类型上下文(这只是一个猜测)。
但是,您可以定义一个函数来将上下文附加到所有 DecsQ 类型类实例上:
appendInstancesCxtQ :: DecsQ -> Q Cxt -> DecsQ
appendInstancesCxtQ = liftM2 $ \ds c -> map (`appendInstanceCxt` c) ds
where appendInstanceCxt (InstanceD c ts ds) c' = InstanceD (c++c') ts ds
appendInstanceCxt d _ = d
然后,您可以使用它来修改准引用表达式的结果:
let v = varT $ mkName "a"
context = sequence [[t| Eq $v |]]
in
[d| instance Bar (Foo $v) where
quux _ = undefined
|] `appendInstancesCxtQ` context
它看起来不太好,但它仍然比在 InstanceD 构造函数之上构建所有内容要好。
关于haskell - 如何在类实例声明中拼接类型上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28868123/
我是一名优秀的程序员,十分优秀!