gpt4 book ai didi

haskell - 如何在类实例声明中拼接类型上下文?

转载 作者:行者123 更新时间:2023-12-02 18:12:00 25 4
gpt4 key购买 nike

例如:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com