1

Scala でエラーを処理するための次のコードを見ています。

package challenge1

import core._, Syntax._

sealed trait Error
case class Explosion(exception: Throwable) extends Error
case object NotFound extends Error
case object InvalidRequest extends Error
case object InvalidMethod extends Error
case object Unauthorized extends Error

object Error {
  implicit def ErrorEqual =
    Equal.derived[Error]
}

case class Fail[A](error: Error) extends Result[A]
case class Ok[A](value: A) extends Result[A]

sealed trait Result[A] {
  def fold[X](
    fail: Error => X,
    ok: A => X
  ): X = this match {
    case Fail(error) => fail(error)
    case Ok(value) => ok(value)
  }

  def map[B](f: A => B): Result[B] =
    flatMap(f andThen Result.ok)

  def flatMap[B](f: A => Result[B]): Result[B] =
    fold(Result.fail, f)

  def getOrElse(otherwise: => A): A =
    fold(_ => otherwise, identity)

  def |||(alternative: => Result[A]): Result[A] =
    fold(_ => alternative, _ => this)
}
...

ここで、Clojureで Maybe Monad を使用して例外を処理するコードを確認できます。

(use '[clojure.contrib.monads :only [maybe-m]])

(defmacro maybe 
    ([bindings return] 
        `(domonad maybe-m ~bindings ~return))
    ([bindings return else] 
        `(let [result# (maybe ~bindings ~return)]
            (if (nil? result#)
                ~else
                result#))))

ここで、Jim Duey が継続に関する例外処理について説明しています

(defn mf-a [x]
  (println "starting mf-a")
  (fn [c]
    (println "completing mf-a")
    (c (inc x))))

(defn mf-b [x]
  (println "starting mf-b")
  (fn [c]
    (println "completing mf-b")
    (c (* 2 x))))

(defn mf-c [x]
  (println "starting mf-c")
  (fn [c]
    (println "completing mf-c")
    (c (dec x))))

(def fn8 (m-chain [mf-a mf-b mf-c]))

(すべてのモナドはある意味で継続であることを認識しています- 今のところそれは脇に置いておきます。重大な間違いを犯した場合は、質問を修正できるように助けてください)。

上記の Scala コードに頭を悩ませようとしています。それがMaybeに基づいているのか、Continuationsに基づいているのかを調べようとしています。

私の質問は:エラーモナドを Maybe モナドまたは Continuation モナドの観点から理解できますか?

4

1 に答える 1

2

「~に関して」は大雑把な言い回しです。Resultあなたが示したモナドは、モナドよりも一般的ですMaybeMaybe確かに、それは の特殊なケースだと思いますResult。そして、継続はさらに一般的でありResult、継続の特別なケースと見なすことができます - しかし、それはすべてのモナドが継続であるという意味と同じです。あなたが尋ねることができるもの。(継続は非常に一般的な構造であるため、継続の観点は理解に役立つとは思いませんが、そうかもしれませんが、もしそうなら、すべてのモナドが継続であるという意味でなければなりません)

Result直接理解しようとすることをお勧めします。それは非常に単純であり、あなたが与える他の2つの例との違いは重要です. そうは言っても、それを「 、ただし、 (任意の)の可能な値が1つだけではなく異なる」と考えるのに役立つかもしれません。それはあなたが望んでいた「の観点から」ですか?MaybeNoneFail(e)e: Error

于 2015-01-03T10:52:47.480 に答える