下面的代码是从一篇论文(R. O. Bjarnason,Stackless Scala with Free Monads)改编而来的。Stackless Scala免费Monads,完整示例
该论文的标题指向了所提出的数据结构的目的 - 即在固定堆栈空间中提供递归处理,并让用户以清晰的方式表达递归。
具体而言,我的目标是建立一个monadic结构,在升序时基于简单模式匹配在恒定堆栈空间中提供对不变树对(二叉树)或列表(n-ary-tree)的结构重写。
sealed trait Free[S[+_], +A]{
private case class FlatMap[S[+_], A, +B](
a: Free[S, A],
f: A => Free[S, B]
) extends Free[S, B]
def map[B](f: A => B): Free[S, B] = this.flatMap((a:A) => Done[S, B](f(a)))
def flatMap[B](f: A => Free[S, B]): Free[S, B] = this match {
case FlatMap(a, g) => FlatMap(a, (x: Any) => g(x).flatMap(f))
case x => FlatMap(x, f)
}
@tailrec
final def resume(implicit S: Functor[S]): Either[S[Free[S, A]], A] = {
this match {
case Done(a) => Right(a)
case More(k) => Left(k)
case FlatMap(a, f) => a match {
case Done(a) => f(a).resume
case More(k) => Left(S.map(k)((x)=>x.flatMap(f)))
case FlatMap(b, g) => b.flatMap((x: Any) => g(x).flatMap(f)).resume
}
}
}
}
case class Done[S[+_], +A](a: A) extends Free[S, A]
case class More[S[+_], +A](k: S[Free[S, A]]) extends Free[S,A]
trait Functor[F[+_]] {
def map[A, B](m: F[A])(f: A => B): F[B]
}
type RoseTree[+A] = Free[List, A]
implicit object listFunctor extends Functor[List] {
def map[A, B](a: List[A])(f: A => B) = a.map(f)
}
var tree : Free[List, Int]= More(List(More(List(More(List(Done(1), Done(2))), More(List(Done(3), Done(4))))), More(List(More(List(Done(5), Done(6))), More(List(Done(7), Done(8)))))))
如何使用Free实现重写?
模式匹配器的钩子在哪里? - 上升时,模式匹配器必须暴露给每个整个子树!
这可以在一个块内完成吗? [此问题已编辑]
如何是树操纵 ... tree.flatMap(I =>更多[列表,INT](列表(完成(I - 1),完成第(i + 1)))) 然后内实现为块? – tod3a
@ tod3a:看我的更新。 –
函数to(tree:BinTree [Int]):T不是tailrecursive,[参见fork](https://gist.github.com/t0d3a/6339467),或者是作为泛型蹦床的Free的目的的蹦床。 – tod3a