通过 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
我正在 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