import java.util.ArrayList; import java.util.List; import java.util.function.Function; public final class MonadList { public static void main(String[] aArgs) { Monad integers = Monad.unit(List.of( 2, 3, 4 )); Monad strings = integers.bind(MonadList::doubler).bind(MonadList::letters); System.out.println(strings.getValue()); } private static Monad doubler(List aList) { return Monad.unit(aList.stream().map( i -> 2 * i ).toList()); } private static Monad letters(List aList) { return Monad.unit(aList.stream().map( i -> Character.toString((char) (64 + i)).repeat(i) ).toList()); } } final class Monad { public static Monad unit(List aList) { return new Monad(aList); } public Monad bind(Function, Monad> aFunction) { return aFunction.apply(list); } public List getValue() { return list; } private Monad(List aList) { list = new ArrayList(aList); } private List list; }