Ist es möglich, die freie Monade in Clojure zu machen?

Es hat einige herausragende Arbeiten mit Monaden in Clojure von gegebenKonrad Hinsen, Jim Duey undLeonardo Borges.

Meine Frage ist - ist es möglich, die freie Monade in Clojure zu machen?

Dies ist ein Beispiel in Haskell Aus einem Artikel über Scala:

data Free f r = Free (f (Free f r)) | Pure r

Dies ist das entsprechende Scala-Beispiel

sealed abstract class Free[S[+_], +A](implicit S: Functor[S]) {
  final def map[B](f: A => B): Free[S, B] =
    flatMap(a => Return(f(a)))

  final def flatMap[B](f: A => Free[S, B]): Free[S, B] = this match {
    case Gosub(a, g) => Gosub(a, (x: Any) => Gosub(g(x), f))
    case a           => Gosub(a, f)
  }
  ...
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage