다음 코드는 논문 (R. O. Bjarnason, 무료 모나드가있는 스택리스 스칼라)에서 수정되었습니다.무료 모나드가있는 스택리스 스칼라
이 논문의 제목은 제안 된 데이터 구조의 목적을 총체적으로 - 즉, 일정한 스택 공간에서 재귀 적 처리를 허용하고 사용자가 명확한 방식으로 재귀를 표현할 수 있도록하는 것을 가리킨다.
필자의 목표는 오름차순 상수 스택 공간에서 간단한 패턴 일치를 기반으로하는 불변의 트리 (이진 트리) 또는 목록 (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)))))))
무료를 사용하여 재 작성하는 방법은 무엇입니까?
패턴 일치 자의 후크는 어디에 있습니까? - 오름차순으로 패턴 매처를 각 전체 하위 트리에 노출해야합니다!
for 블록 내에서이 작업을 수행 할 수 있습니까? [. 문제는 편집 된]
어떻게 트리 조작 ... tree.flatMap이다 ((i가 완료 I => 추가 [리스트, 지능 (목록 (- 1), 횟수 (I + 1)))) 다음 내에 달성 블록? – tod3a
@ tod3a : 내 업데이트를 참조하십시오. –
함수 (트리 : BinTree [Int]) : T는 꼬리 재귀가 아니며 [포크] (https://gist.github.com/t0d3a/6339467)를 참조하거나 일반화 된 트램펄린으로 Free의 목적이었던 트램펄린이 아닙니다. – tod3a