如何解决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中,并且基本上没有文档说明。但这也许还是有帮助的。...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。