Patrząc na StateT
może być pouczające:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
Tutaj państwo nie jest ani „wewnętrzny”, ani „zewnętrzny”, ale jego typ jest przeplatany z monady jest transformujące, niektóre bity w środku, jakiś zewnątrz. I rzeczywiście:
newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a }
jest "zewnętrzna". To zależy od tego, jaki to transformator. Prawdopodobnie istnieje pewna teoria kategorii, która przynajmniej częściowo wyjaśnia to przeplatanie, jestem ciekawy o tym (inteligencja?).
kontrastowy z aplikacyjnych funktorów, na którym
newtype Compose f g a = Compose { getCompose :: f (g a) }
jest aplikacyjne, tak więc, nie zawsze jest jasny „wewnętrzny zewnętrzną /” związek. Można zrób aplikacyjnych tylko StateT
, a znalezienie jej strukturę przez Compose (State s)
:
ApplicativeStateT s f a = s -> (s, f a)
W rzeczywistości, istnieje jeszcze jeden, jeśli komponować z prawej strony:
ApplicativeStateT' s f a = f (s -> (s,a))
Ale monady nie mają takiej prawidłowości.
Ponieważ przekształcamy monadę 'Maybe', a nie to, co zawiera" Może "? –
Wydaje mi się, że już gdzieś tam odpowiedziano, ale nie mogę go znaleźć. – leftaroundabout