我正在尝试编写一个带有常规函数的箭头转换器,并将它们转换为抽象值的计算。如果我们有一个“源”箭头,
f :: Int -> Int
f x = x + 1
那么目标是让f处理提升的 [原文如此?] 抽象值类型,在这个例子中
f' :: AV Int -> AV Int
f' (Const x) = Const (f x)
-- pass along errors, since AV computation isn't always defined
-- or computable in the case of errors
f' (Error s) = Error s
-- avRep = "abstract representation". Think of symbolic math manipulation or ASTs.
f' (Abstract avRep) = AVRepPlus avRep (AVRepConst 1)
然而,为了成功地实现这个箭头,需要提升一些类型,以便在任意深度拥有具有一些具体值和一些抽象值的异构数据结构。我最终做的是为常规的 haskell 构造函数添加特殊类型,例如,如果
g = uncurry (+) -- i.e. g (x, y) = x + y
然后我为元组构造函数 (,) 添加一个抽象表示,
AVTuple :: AV a -> AV b -> AV (a, b)
并且g的代码被提升到 [展开一点],
g' (AVTuple (AVConst a) (AVConst b)) = (AVConst (g (a, b)))
g' (AVTuple (AVError e) _) = (AVError e)
-- symmetric case here, i.e. AVTuple _ (AVError e)
g' (AVTuple a@(AVTuple _ _) b) = -- recursive code here
AVEither 也需要这样做。这最终会成为很多案例。有没有一个很好的方法来解决这个问题?
我是 Haskell 新手,所以请给我发参考资料或半详细的解释;可能我读过的最接近的东西是 SYBR 论文(废弃你的样板革命)第 1-3 节。
非常非常感谢你!