如果我有一个 value a: Free[Op, A]
,是否可以“展平”结构,a
以便Op
由自由 monad 绑定在一起的两个 s 可以折叠成一个?
上下文:我想在解释之前将其作为优化步骤执行,因为它的语义Op
是它的操作是幂等的。因此,如果两个“连续”出现,则可以在不影响程序语义的情况下消除第二个。
如果我有一个 value a: Free[Op, A]
,是否可以“展平”结构,a
以便Op
由自由 monad 绑定在一起的两个 s 可以折叠成一个?
上下文:我想在解释之前将其作为优化步骤执行,因为它的语义Op
是它的操作是幂等的。因此,如果两个“连续”出现,则可以在不影响程序语义的情况下消除第二个。
据我了解,没有办法对 Free Monad 程序进行这种自省,因为它代表顺序计算,其中每个步骤都取决于另一个步骤的结果。
John de Goes 就 Free Monad 与 Free Applicative 的优缺点进行了精彩的演讲(https://www.youtube.com/watch?v=H28QqxO7Ihc)。后者赋予内省的力量。