如果 TH 的功能有副作用,是否有任何适当的方法可以确保它们的安全?比如说,我想要一个在编译时调用 git 并生成版本字符串的函数:
{-# LANGUAGE TemplateHaskell #-}
module Qq where
import System.Process
import Language.Haskell.TH
version = $( [| (readProcess "git" ["rev-parse", "HEAD"] "") |] )
版本类型是IO String。但版本在运行时完全没有副作用,
它仅在编译时有副作用。有没有办法在不使用 unsafePerformIO 的情况下使其在运行时变得纯净?
第一:通常,生成代码的运行时类型独立于Template Haskell子表达式的编译时类型,因此运行时类型不必在IO中。
现在,要在不使用 unsafePerformIO 的情况下运行此命令,请使用runIO http://hackage.haskell.org/packages/archive/template-haskell/latest/doc/html/Language-Haskell-TH-Syntax.html#v%3arunIO。然后,您必须自己构造 Expr,而不使用 [| |](这也解决了类型问题)。
实际上,如果你使用 [| |] 插入一个 IO 计算,我认为它只会插入计算,不会运行它。但这是无关紧要的,因为无论它做什么,这都不是做你想做的事情的正确方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)