So monad is used to construct a new Type dynamically instead of writing it? And functor is also the same?
Class<List<String>> thisistypeconstructor(Class<String> strClass)
And if I generify the types above, maybe something like
<OutputType> thisistypeconstructor(<InputType>)
template<template<class> class F, class T>
using apply = F<T>;
static_assert(is_same_v<apply<list, string>, list<string> >);