Я прочитал две замечательные серии статей о автомобилях. и бесплатные монады и я хотел бы как-то совместить эти две техники.
Я хотел бы иметь что-то вроде:
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
) в каком-либо интерпретаторе.
Итак, я думаю, мой настоящий вопрос: как я могу реализовать то, что описано выше?
Может быть, я делаю все это неправильно, и есть лучший способ. Может кто-нибудь привести простой пример или дать несколько ссылок на что-то подобное?
Free
заключается в том, что вы не можете реализоватьMonadFix
илиArrowLoop
. Вам нужно? - person Daniel Wagner   schedule 18.11.2015Free
, например только сArrow
? - person starper   schedule 18.11.2015Auto
сама по себе является формой фиксированной точки. Почему бы не использовать с нимProgramF
, а неProgram
? - person gallais   schedule 18.11.2015Process
es из базового функтора преобразователей состояния stackoverflow.com/q/27997155/414413 - person Cirdec   schedule 19.11.2015