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