Авто, стрелки и свободные монады

Я прочитал две замечательные серии статей о автомобилях. и бесплатные монады и я хотел бы как-то совместить эти две техники.

Я хотел бы иметь что-то вроде:

data ProgramF a = Get (String -> a) | Set String a
instance Functor ProgramF where ...
type Program = Free ProgramF

get' :: Program String
get' = liftF $ Get id

set' :: String -> Program ()
set' s = liftF $ Set s ()

auto1 :: AutoM Program () String
auto1 = arrM \_ -> get'

auto2 :: AutoM Program String ()
auto2 = arrM \s -> set' s

auto3 :: AutoM Program () ()
auto3 = auto1 >>> auto2

...

Но есть некоторые проблемы, например, ArrowLoop требует, чтобы Program был экземпляром MonadFix, что невозможно, насколько я понимаю.

Итак, мои вопросы:

  • Есть ли способы заставить Auto и Free работать вместе?
  • А если нет, то может есть другие пути достижения цели?

Примечание. Я новичок в функциональном программировании, поэтому в теории я мало что понимаю.

Обновление:

В одном из комментариев упоминалось, что Auto сама по себе является формой fixpoint и я могу использовать ProgramF напрямую с ним. Итак, я предполагаю, что тип Auto должен выглядеть примерно так:

newtype Auto f a b = Auto (a -> f (b, (Auto f a b)))

Но теперь проблема в том, что я не могу понять, как составить два Auto, чтобы f не было Monad.

Моя конечная цель – получить составные фрагменты кода с внутренним состоянием и способ очистить мой код, скрывающий все IO эффекты (например, log или getLine) в каком-либо интерпретаторе.

Итак, я думаю, мой настоящий вопрос: как я могу реализовать то, что описано выше?

Может быть, я делаю все это неправильно, и есть лучший способ. Может кто-нибудь привести простой пример или дать несколько ссылок на что-то подобное?


person starper    schedule 17.11.2015    source источник
comment
Пока ваша единственная реальная жалоба на Free заключается в том, что вы не можете реализовать MonadFix или ArrowLoop. Вам нужно?   -  person Daniel Wagner    schedule 18.11.2015
comment
Связано: stackoverflow.com/q/29161923/414413   -  person Cirdec    schedule 18.11.2015
comment
@DanielWagner На самом деле я точно не знаю, понадобится мне это или нет, но у меня есть некоторые мысли о том, как это может быть полезно. И я не хочу однажды обнаружить, что мне это действительно нужно, но не могу получить :) @Cirdec Спасибо, я посмотрю. Кстати, можно ли что-то не совсем такое же, но похожее (имею в виду очистительную часть) реализовать без Free, например только с Arrow?   -  person starper    schedule 18.11.2015
comment
Auto сама по себе является формой фиксированной точки. Почему бы не использовать с ним ProgramF, а не Program?   -  person gallais    schedule 18.11.2015
comment
Библиотека machines создает Processes из базового функтора преобразователей состояния stackoverflow.com/q/27997155/414413   -  person Cirdec    schedule 19.11.2015
comment
@Cirdec Спасибо за эти ссылки, я обязательно посмотрю. Кажется, что много информации, чтобы обернуть мою голову.   -  person starper    schedule 19.11.2015
comment
@gallais Не могли бы вы привести пример того, как это сделать? Или может дать ссылки на такие примеры?   -  person starper    schedule 19.11.2015