Итак, я понял, как реализовать Reader
(и ReaderT
, не показан) с помощью operational
пакета:Как я могу использовать Reader, используя свободные монады?
{-# LANGUAGE GADTs, ScopedTypeVariables #-}
import Control.Monad.Operational
data ReaderI r a where
Ask :: ReaderI r r
type Reader r a = Program (ReaderI r) a
ask :: Reader r r
ask = singleton Ask
runReader :: forall r a. Reader r a -> r -> a
runReader = interpretWithMonad evalI
where evalI :: forall b. ReaderI r b -> (r -> b)
evalI Ask = id
Но я не могу понять, для моей жизни, как сделать это с помощью свободных монад (Я использую пакет Эдварда Кеммета free
). Ближайший я получил это, что я понимаю, это обман (что-то о том, как ((->) r)
уже монада):
import Control.Monad.Free
type Reader r a = Free ((->) r) a
ask :: Reader r r
ask = Free Pure
runReader :: Reader r a -> r -> a
runReader (Pure a) _ = a
runReader (Free k) r = runReader (k r) r
-- Or, more simply and tellingly:
--
-- > runReader = retract
Даже если это не так глуп, как я подозреваю, что это, это не то, что я хочу, потому что я хочу, в основном, иметь возможность проверить Reader
как данные ...
Я не думаю, что это можно сделать без какого-либо типа функции. –