scala - Scala中具有相互递归类型的递归方案
问题描述
给定以下数据类型:
sealed trait Expression
final case class Add(a: Expression, b: Expression) extends Expression
final case class Block(statements: List[Statement], result: Expression) extends Expression
sealed trait Statement
final case class ExpressionStatement(expression: Expression) extends Statement
final case class Assignment(variable: String, expression: Expression) extends Statement
我的第一步是执行以下操作:
sealed trait ExpressionF[E, S]
final case class AddF[E, S](a: E, b: E) extends ExpressionF[E, S]
final case class BlockF[E, S](statements: List[S], result: E) extends ExpressionF[E, S]
sealed trait StatementF[E, S]
final case class ExpressionStatementF(expression: E) extends StatementF[E, S]
final case class Print(expression: E) extends StatementF[E, S]
但我不确定如何将 Fix 与两个类型变量一起使用。
如何表示这些类型,以便可以使用 droste 或 matryoshka/Fix 使用递归方案?
解决方案
我认为为了处理相互递归的类型,您需要索引函子。我自己不太确定它是如何工作的,但这里有一个例子——不幸的是它在 Haskell 中。
https://gist.github.com/cstrahan/eab72b39884ef37b7a3c125f77e99a2e
这个库显然实现了相互递归类型的递归方案,但它同样在 Haskell 中并且基本上没有记录。但也许它仍然有帮助......
推荐阅读
- python - 如果列表中存在项目,如何在烧瓶神社中标记复选框?
- azure-api-management - Azure API 管理的新开发者门户在内部 VNET 模式下没有响应
- java - 有效最终变量的使用
- applescript - AppleScript - 将子文件夹中包含的所有文件移动到顶级文件夹
- php - PHP - 如何访问这个复杂的 nbt 节点对象?
- swift - 包含日文字符时缺少 TextField 字体样式
- javascript - useState 中的变量未在 useEffect 回调中更新
- javascript - 如何将 PHP 日期转换为 Javascript 日期?
- android - 如何从 KClass 获取 Dagger2 ViewModelFactory 的类?
- python - 如何在pygame中形成天空盒?