8

Konrad HinsenJim Duey、およびLeonardo Borgesによる Clojure のモナドに関する優れた作業がいくつかあります。

私の質問は、Clojure で Free Monad を実行することは可能ですか?

これは、 Scala に関する記事のHaskell の例です。

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

これは対応する Scala の例です

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)
  }
  ...
}
4

3 に答える 3

0

これらは、あなたの質問に直接答える2つの素晴らしい回答であり、延期する必要があります.

私はまだ自分自身を学んでおり、フリーモナドにはしばしばインタープリターが付随していることに言及して質問を拡大したいと思います.

domonadこれは、次の式で構築されたデータ構造に印刷インタープリターを提供するために、プラグアンドプレイする必要があります。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; INTERPRETER
;;

(def pavlov (domonad tt-monad [a (m-output "hi there pavlov")
                               b (m-bell)
                               c (m-output "howdya like me now?")
                               d (m-bell)
                               e (m-bell)
                               f (m-bell)
                               g (m-done)]
                     g))

(defn bell-interpreter [program]
  (let [{ft           :t ; free type: impure or pure?
         [{t :t
           v :v} next] :v} program]
    (if (= :pure ft)
      "error, shouldn't have a `pure` type"
      (case t
        :output (do (prn v) (bell-interpreter next))
        :bell (do (prn "rinnnng") (bell-interpreter next))
        :done "done!"
        :otherwise "uh oh, that's not a type I recognize"))))
  1. 各ノードについて、 または であるかどうかを確認しFree/ImpureますPure

  2. の場合Impureは、「定義済み」の型の 1 つであるため、解釈できます。「型」ごとにケースを作成し、この再帰データ型の次のメンバーを必ず呼び出します。

于 2016-05-28T21:42:06.767 に答える