Es ist natürlich nicht möglich, diese in allen Umständen durch diese zu ersetzen. Wenn Sie beispielsweise explizit ErrorT . return $ Left "Muahar"
verwenden, muss eine ErrorT String m a
sein.
Jedoch sind beide Arten von Form a -> M String
mit einer (transformator stack) monadisch M
das eine Instanz von MonadIO
und MonadError String
ist. Wenn diese Funktion also nur mit Aktionen des Forms liftIO ioaction
und möglicherweise throwError
und catchError
definiert wird, funktioniert sie wie jede dieser Monaden. Der allgemeine Typ ist
foo :: (MonadIO m, MonadError String m) => a -> m String
In der Regel ist es wegen Polymorphismus und Überladung. Es ist nicht möglich, genau zu sagen, ohne den Code für 'foo' zu sehen. – Lee