gpt4 book ai didi

haskell - 具有多种类型的递归方案

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

现在,我有一个表达式的 AST,它在递归类型上是多态的:

data Expr a = Const Int
| Add a a

这非常有用,因为它允许我使用一种类型进行普通递归( Fix Expr ),而当我需要附加额外信息时使用另一种类型( Cofree Expr ann )。

当我想在此递归方案中引入另一种类型时,会出现此问题:
data Stmt a = Compound [a]
| Print (Expr ?)

我不知道为 Expr 放什么术语没有引入额外的类型变量并破坏与我已经编写的所有通用函数的兼容性。

可以做到这一点,如果可以,这是一个有用的模式吗?

最佳答案

递归方案的观点是将递归类型视为仿函数的固定点。表达式的类型是以下仿函数的不动点:

data ExprF expr = Const Int
| Add expr expr

更改变量名称的目的是明确表明它是实际表达式类型的占位符,否则将定义为:
data Expr = Const Int | Add Expr Expr

Stmt ,有两种递归类型, ExprStmt本身。所以我们放了两个洞/未知数。
data StmtF expr stmt = Compound [stmt]
| Print expr

当我们用 Fix 取定点时或 Cofree ,我们现在正在求解一个由两个方程组成的系统(一个用于 Expr ,一个用于 Stmt ),并且带有一些样板。

而不是应用 FixCofree直接地,我们将这些固定点组合器( FixCofreeFree)作为构造表达式和语句的参数进行推广:
type Expr_ f = f ExprF
type Stmt_ f = f (StmtF (Expr_ f))

现在我们可以说 Expr_ FixStmt_ Fix对于未注释的树, Expr_ (Flip Cofree ann) , Stmt_ (Flip Cofree ann) .不幸的是,我们必须支付另一笔 LOC 费用才能使类型匹配,并且类型变得更加复杂。
newtype Flip cofree a f b = Flip (cofree f a b)

(这也假设我们想在任何地方同时使用相同的 FixCofree。)

要考虑的另一种表示是( called HKD nowadays):
data Expr f = Const Int
| Add (f Expr) (f Expr)

data Stmt f = Compount [f Stmt]
| Print (f (Expr f))

您仅从注释/无注释( f = Identity(,) ann )中抽象而不是从递归中抽象。

关于haskell - 具有多种类型的递归方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51073110/

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