Class LazyRec<A,B>
java.lang.Object
com.jnape.palatable.lambda.functions.builtin.fn2.LazyRec<A,B>
- Type Parameters:
A
- the input typeB
- the output type
- All Implemented Interfaces:
Fn1<Fn2<Kleisli<? super A,
,? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, Fn1<A, Lazy<B>>> Fn2<Fn2<Kleisli<? super A,
,? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, A, Lazy<B>> Applicative<Fn1<A,
,Lazy<B>>, Fn1<Fn2<Kleisli<? super A, ? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, ?>> Cartesian<Fn2<Kleisli<? super A,
,? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, Fn1<A, Lazy<B>>, Fn1<?, ?>> Cocartesian<Fn2<Kleisli<? super A,
,? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, Fn1<A, Lazy<B>>, Fn1<?, ?>> Contravariant<Fn2<Kleisli<? super A,
,? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, Profunctor<?, Fn1<A, Lazy<B>>, Fn1<?, ?>>> Functor<Fn1<A,
,Lazy<B>>, Fn1<Fn2<Kleisli<? super A, ? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, ?>> Profunctor<Fn2<Kleisli<? super A,
,? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, Fn1<A, Lazy<B>>, Fn1<?, ?>> Monad<Fn1<A,
,Lazy<B>>, Fn1<Fn2<Kleisli<? super A, ? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, ?>> MonadReader<Fn2<Kleisli<? super A,
,? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, Fn1<A, Lazy<B>>, Fn1<Fn2<Kleisli<? super A, ? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, ?>> MonadRec<Fn1<A,
,Lazy<B>>, Fn1<Fn2<Kleisli<? super A, ? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, ?>> MonadWriter<Fn2<Kleisli<? super A,
? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, Fn1<A, Lazy<B>>, Fn1<Fn2<Kleisli<? super A, ? extends B, Lazy<?>, Lazy<B>>, A, Lazy<B>>, ?>>
public final class LazyRec<A,B>
extends Object
implements Fn2<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,A,Lazy<B>>
Given a
Fn2
that receives a recursive function and an input and yields a lazy
result, and an
input, produce a lazy
result that, when forced, will recursively invoke the function until it terminates
in a stack-safe way.
Example:
Lazy<BigInteger> lazyFactorial = lazyRec((fact, x) -> x.equals(ONE)
? lazy(x)
: fact.apply(x.subtract(ONE)).fmap(y -> y.multiply(x)),
BigInteger.valueOf(50_000));
BigInteger value = lazyFactorial.value(); // 3.34732050959714483691547609407148647791277322381045 x 10^213236
-
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface com.jnape.palatable.lambda.functions.Fn1
andThen, carry, cartesian, censor, choose, cocartesian, diMap, diMapR, discardL, flatMap, fmap, lazyZip, listens, local, pure, self, thunk, toFunction, trampolineM, zip, zip