gpt4 book ai didi

haskell - 如何将 [TExp a] 转换为 TExp [a],或者以编程方式将 FineTH 应用于多个值?

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

我一直在使用refined最近,对于 Haskell 中的细化类型,遇到了一个重大的可用性问题。我不知道如何在编译时优化整个值列表。

例如我可以写:

{-# LANGUAGE TemplateHaskell #-}

import Refined

oneToThree :: [Refined Positive Int]
oneToThree = [$$(refineTH 1), $$(refineTH 2), $$(refineTH 3)]

但我不能这样做,这排除了使用范围语法的能力,因为 Refined没有(有充分的理由)有 Enum 的实例.

我希望能够做类似的事情

oneToThree :: [Refined Positive Int]
oneToThree = $$(traverse refineTH [1..3])

但我无法编译它,因为我无法举起 [TExp (Refined Positive Int)]进入TExp [Refined Positive Int] .

是否有我缺少的模板 haskell 魔法可以让我做到这一点?

如果有人有建议,也愿意接受更好的轻量级细化类型库的建议。

最佳答案

sequenceQTExpList :: [Q (TExp a)] -> Q (TExp [a])
sequenceQTExpList [] = [|| [] ||]
sequenceQTExpList (x:xs) = [|| $$(x) : $$(sequenceQTExpList xs) ||]

然后将其用作

$$(sequenceQTExpList $ map refineTH [1..3])

你说得对,感觉就像穿越。不过,该类型有点偏离,因为有额外的 Q 漂浮在周围。我没有立即看到任何可以让您有效地组合这些层的内容。

不幸的是,这里使用的很多机制是 TH 语法而不是函数。只是没有一种明显的方法可以将提升和拼接作为函数进行,因此您必须为每种容器类型编写定制的帮助程序,而不是使用 Traversable。这是一个有趣的问题。如果有一个干净的解决方案,并且将其提交给维护人员,那么它很有可能成为模板 Haskell 的 future 版本。但我现在还没有看到。

关于haskell - 如何将 [TExp a] 转换为 TExp [a],或者以编程方式将 FineTH 应用于多个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60627472/

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