Pytanie "Typy danych à la carte" w stosunku do zagnieżdżonych transformatorów FreeT


W komentarzach do to pytanie, wspomniano, że zagnieżdżanie kilku warstw FreeT transformatory (każdy z innym funktorem) mogą służyć podobnemu celowi "Typy danych à la carte" podejście (które łączy same funktory za pomocą produktów ubocznych), pomimo dwóch podejść, które nie są izomorficzne.

Moje pytanie brzmi: gdzie leży różnica? Czy istnieją przypadki, w których jedno podejście może obsłużyć, ale nie drugie? Czy dopuszczają różnych tłumaczy?

Aktualizacja: Oto prosty przykład zagnieżdżenia FreeT transformatory. Rozszerzanie obliczeń dzięki możliwości wysyłania komunikatów dziennika i żądania opóźnień:

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  

(Ten konkretny przykład mógłby być jeszcze prostszy dzięki użyciu Producers z pipes pakiet, który jest szczególnym rodzajem darmowych transformatorów Monady.)


16
2018-01-28 20:51


pochodzenie


Jest to, jak rozumiem, trwająca debata w społeczności Haskell. Zobacz na przykład Kiselyov, Sabry & Swords " "Efekty rozszerzalne: alternatywa dla transformatorów Monady" (PDF) i wynikające z tego dyskusje w Lambda The Ultimate i / r / haskell w Reddit. - Luis Casillas
@LuisCasillas "Efekty rozszerzalne" odpowiadają zagnieżdżonym FreeT podejście do "datatypów à la carte"? - danidiaz
Uważam, że odpowiada to "datatypom à la carte", ale nie jestem w 100% pewny. W każdym razie, jeśli czytam to dobrze emkett powiedział Extensible Effects ~ = Typy danych à la carte + otwarte związki. - Luis Casillas


Odpowiedzi:


Nie jestem w 100% pewny, czy rozumiem to w ten sposób, więc jeśli ktoś zauważy coś (rażąco) nie tak, proszę go wskazać.

Począwszy od Extensible Effects, the Eff typ jest w zasadzie izomorficzny do:

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

gdzie Union es a jest typem listy / sumy listy typów es sparametryzowane przez a. Union jest izomorficzne wobec wielokrotnych aplikacji :+: z Typów danych a la Carte. Zsumować (!) To wszystko, Eff wydaje się być zoptymalizowaną wersją typów danych a la Carte.

Możemy wywnioskować, że różnice między transformatorami monadowymi a efektami rozszerzalnymi opisanymi w artykule mają zastosowanie tutaj. W szczególności, wolne sterty transformatorów monady nie mogą przeplatać efektów, podczas gdy Typy danych a la Carte / Extensible Effects mogą.


5
2018-01-30 17:16