"Типы данных à la carte" против вложенных трансформаторов FreeT

В комментариях к этому вопросу было упомянуто, что вложение нескольких слоев < Трансформаторы i1 > (каждый с другим функтором) могут служить аналогичной целью для подхода "Типы данных по выбору" ( который объединяет сами функторы с использованием копроизведений), несмотря на то, что оба подхода не являются изоморфными.

Мой вопрос: где разница? Существуют ли случаи, когда один подход может справиться, но не другой? Они допускают разные переводчики?

Обновление: Вот простой пример вложенных трансформаторов FreeT. Расширение вычислений с возможностью извлечения сообщений журнала и задержки запросов:

import Data.Functor.Identity
import Control.Monad
import Control.Monad.Trans
import Control.Monad.Trans.Free
import Control.Concurrent

type Delay = Int

type DelayT = FreeT ((,) Delay)

delay ::  Monad m => Delay -> DelayT m ()
delay t = liftF (t,()) 

type Message = String

type LogT = FreeT ((,) Message)

emitLog :: Monad m => Message -> LogT m ()
emitLog msg = liftF (msg,()) 

type Effected = DelayT (LogT Identity)

program :: Effected Char
program = lift (emitLog "foo") >> delay 1000 >> return 'c'

interpret :: Effected a -> IO a 
interpret =                          (iterT $ \(d,a)->threadDelay d >> a)  
            . hoistFreeT             (iterT $ \(m,a)->putStrLn m >> a) 
            . hoistFreeT (hoistFreeT (return . runIdentity))

main :: IO ()
main = interpret program >>= putChar  

(Этот конкретный пример можно было сделать еще проще, используя Producer из пакета pipes, который является особым видом свободных монадных трансформаторов.)

Ответы

Ответ 1

Я не уверен на 100% в своем собственном понимании этого, поэтому, если кто-либо замечает что-либо (откровенно) неправильно, укажите его.

Начиная с Extensible Effects, тип Eff в основном изоморфен:

data Eff :: [* -> *] -> * -> * where
    Pure :: a -> Eff es a
    Side :: Union es (Eff es a) -> Eff es a

где Union es a - тип объединения/суммы списка типов es, параметризованный a. Union изоморфен повторным приложениям :+: из типов данных a la Carte. Суммирование (!) Все вверх, Eff представляется оптимизированной версией типов данных a la Carte.

Мы можем заключить, что здесь применяются различия между монадными трансформаторами и расширяемыми эффектами, описанными в статье. В частности, свободные стеки трансформаторов монады не могут перемежать эффекты, тогда как типы данных a la Carte/Extensible Effects могут.