- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用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/
我一直在使用refined最近,对于 Haskell 中的细化类型,遇到了一个重大的可用性问题。我不知道如何在编译时优化整个值列表。 例如我可以写: {-# LANGUAGE TemplateHask
我是一名优秀的程序员,十分优秀!