Class SafeT<M extends MonadRec<?,​M>,​A>

  • Type Parameters:
    M - the MonadRec instance
    A - the carrier type
    All Implemented Interfaces:
    Applicative<A,​SafeT<M,​?>>, Functor<A,​SafeT<M,​?>>, Monad<A,​SafeT<M,​?>>, MonadBase<M,​A,​SafeT<?,​?>>, MonadRec<A,​SafeT<M,​?>>, MonadT<M,​A,​SafeT<M,​?>,​SafeT<?,​?>>

    public final class SafeT<M extends MonadRec<?,​M>,​A>
    extends java.lang.Object
    implements MonadT<M,​A,​SafeT<M,​?>,​SafeT<?,​?>>
    A stack-safe monad transformer that can safely interpret deeply nested left- or right-associated binds for any MonadRec.

    Example:

     
     Times.<Fn1<Integer, Integer>>times(100_000, f -> f.fmap(x -> x + 1), id()).apply(0); // stack-overflow
     Times.<SafeT<Fn1<Integer, ?>, Integer>>times(100_000, f -> f.fmap(x -> x + 1), safeT(id()))
             .<Fn1<Integer, Integer>>runSafeT()
             .apply(0); // 100_000
     
     

    Inspired by Phil Freeman's paper Stack Safety for Free.