object scalaz
Contains interpreters to enable !-notation for Monadic and other keywords in code blocks whose type support scalaz.Bind, scalaz.MonadError and scalaz.MonadTrans.
Author:
杨博 (Yang Bo)
- Source
- scalaz.scala
scalaz.Free.Trampoline is a monadic data type that performs tail call optimization. It can be built from a
@reset
code block within some !-notation, similar to the each method in ThoughtWorks Each.import _root_.scalaz.Trampoline import _root_.scalaz.Free.Trampoline import com.thoughtworks.dsl.keywords.Monadic._ import com.thoughtworks.dsl.domains.scalaz._ import com.thoughtworks.dsl.Dsl.reset val trampoline3 = Trampoline.done(3) def dslSquare = Trampoline.delay { s"This string is produced by a trampoline: ${!trampoline3 * !trampoline3}" }: @reset dslSquare.run should be("This string is produced by a trampoline: 9")
!trampoline3
is a shortcut of!Monadic(trampoline3)
, which will be converted toflatMap
calls by our DSL interpreter. Thus, the methoddslSquare
is equivalent to the following code in scalaz.syntax:def scalazSyntaxSquare = trampoline3.flatMap { tmp1 => trampoline3.flatMap { tmp2 => Trampoline.delay { s"This string is produced by a trampoline: ${tmp1 * tmp2}" } } } scalazSyntaxSquare.run should be("This string is produced by a trampoline: 9")
A@reset
code block can containtry
/catch
/finally
if the monadic data type supports scalaz.MonadError. tryt.scala is a monad transformer that provides scalaz.MonadError, thereforetry
/catch
/finally
expressions can be used inside a@reset
code block whose return type isTryT[Trampoline, ?]
.import com.thoughtworks.tryt.invariant.TryT, TryT._ import scala.util.{Try, Success} type TryTTransfomredTrampoline[A] = TryT[Trampoline, A] val trampolineSuccess0: TryTTransfomredTrampoline[Int] = TryT(Trampoline.done(Try(0))) def dslTryCatch: TryTTransfomredTrampoline[String] = TryT(Trampoline.delay(Try { try { s"Division result: ${!trampoline3 / !trampolineSuccess0}" } catch { case e: ArithmeticException => s"Cannot divide ${!trampoline3} by ${!trampolineSuccess0}" } })): @reset inside(dslTryCatch) { case TryT(trampoline) => trampoline.run should be(Success("Cannot divide 3 by 0")) }
Note that !-notation can be used on both
trampoline3
andtrampolineSuccess0
even when they are different types, i.e.trampoline3
is a vanilla Trampoline, whiletrampolineSuccess0
is a TryT-transfomred Trampoline. It is possible because the interpreters of the keywords.Monadic invoke scalaz.MonadTrans.liftM automatically. The abovedslTryCatch
method is equivalent to the following code in scalaz.syntax:def scalazSyntaxTryCatch: TryTTransfomredTrampoline[String] = { import _root_.scalaz.syntax.monadError._ trampoline3.liftM[TryT].flatMap { tmp0 => trampolineSuccess0.flatMap { tmp1 => TryT(Trampoline.delay(Try(s"Division result: ${tmp0 / tmp1}"))) } }.handleError { case e: ArithmeticException => trampoline3.liftM[TryT].flatMap { tmp2 => trampolineSuccess0.flatMap { tmp3 => TryT(Trampoline.delay(Try(s"Cannot divide ${tmp2} by ${tmp3}"))) } } case e => e.raiseError[TryTTransfomredTrampoline, String] } } inside(scalazSyntaxTryCatch) { case TryT(trampoline) => trampoline.run should be(Success("Cannot divide 3 by 0")) }
- Alphabetic
- By Inheritance
- scalaz
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
-
type
MonadThrowable[F[_]] = MonadError[F, Throwable]
- Attributes
- protected
- abstract class ScalazTransformerDsl[F[_], G[_], A, B] extends Dsl[Monadic[F, A], G[B], A]
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- implicit def scalazMonadTransformerDsl0[F[_[_], _], G[_], A, B](implicit monadTrans: MonadTrans[F], monad0: Monad[G]): ScalazTransformerDsl[G, [β$3$]F[G, β$3$], A, B]
- implicit def scalazMonadTransformerDsl1[F[_[_], _], H[_], G[_], A, B](implicit monadTrans: MonadTrans[F], rest: ScalazTransformerDsl[H, G, A, B]): ScalazTransformerDsl[H, [β$0$]F[G, β$0$], A, B]
- implicit def scalazMonadicDsl[F[_], A, B](implicit bind: Bind[F]): Dsl[Monadic[F, A], F[B], A]
- implicit def scalazReturnDsl[F[_], A, B](implicit applicative: Applicative[F], restReturnDsl: Dsl[Return[A], B, Nothing]): (Return[A], (Nothing) ⇒ F[B]) ⇒ F[B]
- implicit def scalazTryCatch[F[_], A, B](implicit monadError: MonadThrowable[F]): TryCatch[A, F[B], F[A]]
- implicit def scalazTryFinally[F[_], A, B](implicit monadError: MonadThrowable[F]): TryFinally[A, F[B], F[A], F[Unit]]
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()