Im Wesentlichen ja. Normalerweise werden Monaden in einer rein funktionalen Sprache definiert, in der Gleichheit == die üblichen Eigenschaften der Gleichheit hat, d. H. Wir können Gleiche für Gleichgestellte ersetzen. Wenn Sie innerhalb einer solchen Teilmenge von Scala sind, dann können Sie tatsächlich eine natürliche Definition eines parametrischen Typs geben, der möglicherweise außergewöhnliche Berechnungen darstellt. Hier ist ein Beispiel. Das Beispiel passiert tatsächlich mechanisch im Leon-Verifikationssystem für Scala (http://leon.epfl.ch).
import leon.lang._
object TryMonad {
// Exception monad similar to Option monad, with an error message id for None
sealed abstract class M[T] {
def bind[S](f: T => M[S]): M[S] = {
this match {
case Exc(str) => Exc[S](str)
case Success(t) => f(t)
}
}
}
case class Exc[T](err: BigInt) extends M[T]
case class Success[T](t: T) extends M[T]
// unit is success
def unit[T](t:T) = Success(t)
// all laws hold
def leftIdentity[T,S](t: T, f: T => M[S]): Boolean = {
unit(t).bind(f) == f(t)
}.holds
def rightIdentity[T](m: M[T]): Boolean = {
m.bind(unit(_)) == m
}.holds
def associativity[T,S,R](m: M[T], f: T => M[S], g: S => M[R]): Boolean = {
m.bind(f).bind(g) == m.bind((t:T) => f(t).bind(g))
}.holds
}
verliert Dies ist in der Regel die Art und Weise Einheit für 'Try' geschrieben, und es kann argumentiert werden, th Es bricht immer noch das Kompositionsgesetz. Diese Diskussionen sind alle ziemlich hand-wellig und ich persönlich denke nicht, dass sie viel Wert haben. –