"Типы данных à 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 могут.