1

如果我有一个值a: Free[Op, A],是否有可能“扁平化”a的结构,以便两个由自由monad绑定在一起的Op可以合并为一个?优化免费Monad

上下文:我想在解释之前将其作为优化步骤执行,因为Op的语义是其操作是幂等的。因此,如果两个“连续”出现,第二个可以免费获得该程序的语义。

+0

也许这只能在解释器级别完成?这似乎是一个有用的概括。 – beefyhalo

+1

这是Scalaz/cats的实现约束,源于Scala的热切评估策略,而不是基本的自由限制。原因是Gosub/FlatMapped构造函数被'Free'''flatMap'用来防止堆栈溢出:它通过将计算包装到trampoline函数中使得进一步的内省进度变得不可能。 –

回答

2

据我所知,Free Monad程序没有这种类型的自省方法,因为它代表了顺序计算,其中每个步骤都取决于另一个计算的结果。

John de Goes对Free Monad vs Free Applicative(https://www.youtube.com/watch?v=H28QqxO7Ihc)的优缺点进行了很好的讨论。后者赋予内省的力量。