Docs dla monad-control
podać przykład, w jaki sposób utworzyć instancję MonadTransControl
korzystając defaultLiftWith
i defaultRestoreT
. Przykładem jest następujący newtype
:instancja MonadTransControl dla niestandardowego monady
newtype CounterT m a = CounterT {unCounterT :: StateT Int m a}
Przykład ten może być dostosowany do pracy w dowolnym newtype
że określona jest tylko jedna „podstawową” transformatora monadę (takie jak te z transformers
lub mtl
). Ale co z przypadkiem, w którym stos zawiera dwa "elementarne" transformatory? Na przykład, w jaki sposób możemy zdefiniować instancję MonadTransControl
czegoś takiego:
newtype T m a = T {unT :: MaybeT (StateT Int m) a}
Moim problemem jest to, że nie wiem jak ustawić następującą linię
newtype StT CounterT a = StCounter {unStCounter :: StT (StateT Int) a}
z CounterT
aby go pracować dla mojego transformatora T
. W szczególności nie wiem, co umieścić w ostatnim nawiasie. Oczekuje czegoś, co ma charakter (* -> *) -> * -> *
, ale nie mogę stworzyć czegoś takiego.
Wszelkie pomysły?
Dzięki, że działa. Najwyraźniej nie można tego zrobić za pomocą 'defaultLiftWith' /' defaultRestoreT'. Przypuszczalnie są one tylko dla prostych przypadków. Myślę, że nie zamierzam w końcu używać 'MonadBaseControl'. Wydaje się to zbyt skomplikowane i obawiam się, że w przyszłości interfejs API ulegnie zmianie, co utrudni utrzymanie mojego kodu. – safsaf32