1
如果我有一个值a: Free[Op, A]
,是否有可能“扁平化”a
的结构,以便两个由自由monad绑定在一起的Op
可以合并为一个?优化免费Monad
上下文:我想在解释之前将其作为优化步骤执行,因为Op
的语义是其操作是幂等的。因此,如果两个“连续”出现,第二个可以免费获得该程序的语义。
如果我有一个值a: Free[Op, A]
,是否有可能“扁平化”a
的结构,以便两个由自由monad绑定在一起的Op
可以合并为一个?优化免费Monad
上下文:我想在解释之前将其作为优化步骤执行,因为Op
的语义是其操作是幂等的。因此,如果两个“连续”出现,第二个可以免费获得该程序的语义。
据我所知,Free Monad程序没有这种类型的自省方法,因为它代表了顺序计算,其中每个步骤都取决于另一个计算的结果。
John de Goes对Free Monad vs Free Applicative(https://www.youtube.com/watch?v=H28QqxO7Ihc)的优缺点进行了很好的讨论。后者赋予内省的力量。
也许这只能在解释器级别完成?这似乎是一个有用的概括。 – beefyhalo
这是Scalaz/cats的实现约束,源于Scala的热切评估策略,而不是基本的自由限制。原因是Gosub/FlatMapped构造函数被'Free'''flatMap'用来防止堆栈溢出:它通过将计算包装到trampoline函数中使得进一步的内省进度变得不可能。 –