gpt4 book ai didi

haskell - 有没有办法阻止 Data.Generics.Alloy.GenInstances 扫描 Data.Text.Internal?

转载 作者:行者123 更新时间:2023-12-03 13:54:55 25 4
gpt4 key购买 nike

我需要对 AST 进行转换;这是 AST 的一部分:

data Expr
= BinExpr { beOp :: BinaryOp
, beLeft :: Expr
, beRight :: Expr }
| Name Text
| IntegerLit Integer
| StringLit Text
deriving (Data, Typeable)

这是一个相当复杂的 AST,所以涉及到的类型很多。

我正在使用 alloy生成通用转换,特别是:
autoGen :: IO ()
autoGen = do
createDirectoryIfMissing True baseDir
writeInstancesTo inst doc imports targetFile
where
inst = allInstances GenWithoutOverlapped
doc = [genInstance (undefined :: Doc)]
imports = header ++ instanceImports

现在,这在使用 String 时很好,但我正在尝试迁移到 Data.Text。当代码生成运行时,它会像这样读取 Data.Text 的内部结构:
instance (Alloy ([(GHC.Types.Char)]) (f :- ops) BaseOp) =>
Alloy ((Data.Text.Internal.Text)) BaseOp (f :- ops) where
transform _ ops (Data.Text.Internal.pack a0)
= Data.Text.Internal.pack
(transform ops BaseOp (a0))

我相信 pack与 GHC 内部结构相关联,因此这不是有效的模式匹配,无论如何,将代码与 Data.Text 的内部结构混在一起很容易破坏不变量。 (编辑:看起来有一个 instance Data Text where gfoldl f z txt = z pack f (unpack txt) 声明,但无论如何,我不需要/不想遍历文本值。)

有没有办法强制 Alloy 将类型视为原子类型?我希望避免使用 newtype 来包装 Text,因为所有使用 AST 的代码都需要处理它,这反而违背了使用泛型来避免样板的目的。

最佳答案

也许试试这个技巧:我们参数化 Expr键入以覆盖 Data用于 Text 的实例使用合金导出实例时。

data Expr_ text
= BinExpr { beOp :: BinaryOp
, beLeft :: Expr_ text
, beRight :: Expr_ text }
| Name text
...
| StringLit text

代码库的其余部分可以使用这个同义词,希望不会因为类型推断问题而破坏太多。
type Expr = Expr_ Text

但是对于 Data -通用操作,我们使用 newtype wrapper Text并让它表现得像一个空构造函数,希望alloy不需要 gunfold的结果(或者您可以使用模式同义词使其表现得像一个字符串)。
newtype DataText = DataText Text

instance Data DataText where
gunfold _ f _ = f undefined
...
autoGen然后将专注于 DummyText .

使用 Data.Coerce.coerceExpr_ DataText 上轻松地在函数之间转换和 Expr .
coerce :: Expr_ DataText -> Expr
coerce :: Expr -> Expr_ DataText
coerce :: (Expr_ DataText -> Expr_ DataText) -> Expr -> Expr

这可能用于为 Expr 编写合金类型类的实例。 ,基于派生自您的实例。这有点像样板,但希望它可以被包含和隐藏而不会影响其余代码。

关于haskell - 有没有办法阻止 Data.Generics.Alloy.GenInstances 扫描 Data.Text.Internal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50790121/

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