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函數中使得進一步的內省進度變得不可能。 –