Size: a a a

2020 May 06

AV

Alexander Vershilov in Haskell
тогда ты можешь вызвать функцию как qux (magick f)
источник

AV

Alexander Vershilov in Haskell
Вопрос, что такое magic и как его построить
источник

AV

Alexander Vershilov in Haskell
Он должен построить интерпретатор твоей m
источник

AV

Alexander Vershilov in Haskell
Для этого ему нужен стейт и функция выполнения
источник

AV

Alexander Vershilov in Haskell
Т.е. для StateT s IO это s и runStateT
источник

AV

Alexander Vershilov in Haskell
И т.п.
источник

MP

Misha Puzanov in Haskell
забегая вперед — мне же еще нужно unmagic :: IO (Magic m a) -> m a?
источник

AV

Alexander Vershilov in Haskell
Это один из вариантов
источник

MP

Misha Puzanov in Haskell
так
источник

AV

Alexander Vershilov in Haskell
monad-control - что делает оно по стеку трансформеров из каждого достаёт текущий стейт и функцию вычисления
источник

AV

Alexander Vershilov in Haskell
(Ну функция оно по трансформерам опредяется)
источник

AV

Alexander Vershilov in Haskell
restoreT - интерпретатор
источник

AV

Alexander Vershilov in Haskell
liftWith - построитель состояния
источник

AV

Alexander Vershilov in Haskell
Вот, а теперь например вы хотим выкинуть автоматику т.к. она сложная
источник

AV

Alexander Vershilov in Haskell
Мы можем сделать
class LiftApp m where
   mkLift :: m (forall a . m a -> IO a)
источник

AV

Alexander Vershilov in Haskell
Оно вернёт функцию, которая захватила текущее состояние и может его запустить в другом месте
источник

AV

Alexander Vershilov in Haskell
тогда сделав
lift <- mkLift
можно его запустить в другом месте
источник

AV

Alexander Vershilov in Haskell
lift <- mkLift
liftIO $ async $ lift f
источник

AV

Alexander Vershilov in Haskell
функция mkLift подозрительно напоминает unlift 🙂
источник

AV

Alexander Vershilov in Haskell
unliftio сделано вокруг этой идеи
источник