通过 Free Monad 和 Coproduct 自动选择解释器

Interpreter auto-selection via Free Monad and Coproduct

我正在 haskell 玩应用程序架构和免费 monad。我已经记下来了,除了如何在不明确给出完整的 Left/Right 路径的情况下将我的 "instruction" 提升到我的副产品的正确位置。

这是我一直在使用的 haskell 示例:https://gist.github.com/aaronlevin/87465696ba6c554bc72b#file-reasonable-hs

在这里,为了将类型注入副产品,我们明确提到了路径。

例如:

Program :: Coproduct Interaction (Coproduct Auth Logging) a
logC :: (Functor f) => (forall a. Logging a -> f a) -> String -> Free f ()

logger :: String -> Free Program ()
logger = logC (Program . Coproduct . Right . Coproduct . Right)

这里,logger 必须用 Coproduct . Right . Coproduct . Right

手动放在联积的正确位置

Runar 在 scala 中的演讲使用隐式类型转换和 Inject 类型类来实现此结果:https://gist.github.com/runarorama/a8fab38e473fafa0921d#file-gistfile1-scala-L119

简而言之,我想知道 haskell 中是否有办法做到这一点。

正在填写原始问题评论中的答案部分...

原始 Haskell 论文可以在这里找到:Data Types à la Carte

可在此处找到 Haskell 实现:ALaCarte.hs