Почему Control.Monad.Free
в purescript-free
скрывает структуру данных "представление" FreeView
и связанные операторы toView
и т. д.?
С обычной формулировкой Свободной Монады -
data Free f a = Pure a | Free (f (Free f a))
И учитывая функтор, такой как -
data TeletypeF a = PutStrLn String a | GetLine (String -> a)
Я могу написать простой (хотя и уродливый) код, чтобы свернуть цепочку вызовов PutStrLn, например так:
collapseChained :: Free TeletypeF a -> Free TeletypeF a
collapseChained (Free (PutStrLn s1 (Free (PutStrLn s2 c)))) = Free PutStrLn (s1 ++ s2) c
collapseChained f = f
Возможно ли что-то эквивалентное collapseChained
с использованием функций, экспортируемых Purescript Control.Monad.Free
, без использования каких-либо фактических конструкторов данных?