Ok, ich habe so herausgefunden, wie Reader
zu implementieren (und ReaderT
, nicht gezeigt), um das operational
Paket mit:Wie implementiere ich Reader mit freien Monaden?
{-# 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
Aber ich kann mein Leben nicht vorstellen, wie dies mit freiem Monaden zu tun (Ich benutze Edward Kmetts free
Paket). Der nächstgelegene ich bekommen habe ist das, was ich verstehe, ist Betrug (etwas darüber, wie ((->) r)
ist bereits eine Monade):
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
Selbst wenn dies nicht so dumm war, wie ich vermute, es ist, es ist nicht das, was ich will, denn was ich will, ist grundsätzlich in der Lage, eine Reader
als Daten zu prüfen ...
Ich glaube nicht, dass es ohne einen Funktionstyp irgendwo getan werden kann. –