运行 Reader 包裹在 HtmlT 中,产生 Html ()

Run Reader wrapped in HtmlT, producing Html ()

我正在使用 Lucid 为静态站点生成代码,在 HtmlT (Reader MyEnv) monad 中编写代码以透明地传递存储在 MyEnv.

中的一些配置

我使用的框架封装了从Html ()到文件输出的转换,所以我想写一个函数将HtmlT (Reader MyEnv) ()转换为Html ();类似于:

withEnv :: MyEnv -> HtmlT (Reader MyEnv) () -> Html ()

但我还没有想出一个简单的方法来实现它。我是否遗漏了一些基本的东西,或者是否有解决方法?

您可以使用 commuteHtmlT:

commuteHtmlT :: HtmlT (Reader MyEnv) a -> Reader MyEnd (Html a)
runReader :: Reader a r -> a -> r

withEnv :: MyEnv -> HtmlT (Reader MyEnv) a -> Html a
withEnv e = ($ e) . runReader . commuteHtmlT