Haskell 自动、箭头和自由单子

Haskell 自动、箭头和自由单子,haskell,functional-programming,arrows,free-monad,Haskell,Functional Programming,Arrows,Free Monad,我已经阅读了两篇关于和的伟大系列文章,我想以某种方式将这两种技术结合起来 我想要一些像: 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

我已经阅读了两篇关于和的伟大系列文章,我想以某种方式将这两种技术结合起来

我想要一些像:

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
本身就是一种定点形式,我可以直接使用
ProgramF
。所以我猜
Auto
的类型应该是这样的:

newtype Auto f a b = Auto (a -> f (b, (Auto f a b)))
但是现在的问题是,如果没有
f
作为
Monad
,我就不知道如何组合两个
Auto
s

我的最终目标是在某种解释器中隐藏所有
IO
效果(如
log
getLine
),并获得一些具有内部状态的可组合代码片段和净化代码的方法

因此,我想我真正的问题是:如何实现上述内容?


也许我做错了,还有更好的办法。有人能举一个简单的例子或提供一些类似的链接吗?

到目前为止,您对
免费
唯一的实际抱怨是您无法实现
MonadFix
箭头循环
。你需要吗?相关:@DanielWagner实际上我不确定我是否需要它,但我对它如何有用有些想法。我不想有一天发现我真的需要它,但我不能拥有它:)@Cirdec谢谢,我来看看。顺便说一句,如果没有
免费
,例如只有
箭头
自动
本身就是一种固定点,那么可以实现一些不完全相同但类似的东西(我指的是净化部分)。为什么不使用
ProgramF
而不是
Program
呢?该库从状态转换器的基本函子构建
Process
es