有没有办法在 Haskell 中为“IO a”导出 Lift?

问题描述

一段时间以来,每当人们提到免费 monad + 解释器模式的性能影响时,我的脑海中都会有一个模糊的想法:“为什么不在编译时使用 Template Haskell 来评估你的解释器?从而否定了完全免费 monad 的性能影响,基本上将免费 monad + 解释器模式转变为免费 monad + 编译器模式。”

更具体一点,假设我有以下内容

data MyFreeF a = ...
type MyFreeM a = (Free MyFreeF) a

interpret :: MyFreeM a -> IO a
interpret = ...

compileFree :: MyFreeM a -> Q (TExp (IO a))
compileFree m = let x = interpret m in [|| x ||]

所以,从表面上看,这应该可行。我在这里遇到的问题是,这需要为 Lift 派生 IO a。所以我的问题是:这样的事情可能吗?如果不是,为 Lift 推导 IO a 是否有意义(即我们今天不能这样做,但如果我们有 X、Y 和 Z 未来的 GHC 扩展,我们可以!)?>

到目前为止,我已尝试将 DeriveLift 用于 IO 及其组成组件(如 State# 中定义的GHC.IO),但未能走得更远。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...