如果使用副作用,是否有任何正确的方法可以使TH的功能安全?说,我想要一个在编译时调用git并生成版本字符串的函数:
{-# LANGUAGE TemplateHaskell #-}
module Qq where
import System.Process
import Language.Haskell.TH
version = $( [| (readProcess "git" ["rev-parse", "HEAD"] "") |] )
版本的类型是IO String。但是版本在运行时完全没有副作用, 它只在编译时有副作用。有没有办法在不使用unsafePerformIO的情况下在运行时使其纯粹?
答案 0 :(得分:7)
首先:通常,生成的代码的运行时类型独立于Template Haskell子表达式的编译时类型,因此运行时类型不必在IO中。
现在,要在不使用unsafePerformIO的情况下运行此命令,请使用runIO。然后,您必须自己构建Expr,而不使用[| |](这也解决了类型问题)。
实际上,如果你使用[|插入IO计算,我认为它只会插入计算,而不是运行它。但这是无关紧要的,因为无论它做什么,这都不是你想做的事情的正确方法。