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)的優缺點進行了很好的討論。後者賦予內省的力量。