8

如果使用副作用,是否有任何适当的方法可以使 TH 的功能安全?说,我想要一个在编译时调用 git 并生成版本字符串的函数:

{-# LANGUAGE TemplateHaskell #-}

module Qq where

import System.Process
import Language.Haskell.TH

version =  $( [| (readProcess "git" ["rev-parse", "HEAD"] "")  |] )

版本类型为 IO String。但是版本在运行时完全没有副作用,它只在编译时有副作用。有没有办法在不使用 unsafePerformIO 的情况下让它在运行时纯净?

4

1 回答 1

7

第一:通常,生成代码的运行时类型独立于 Template Haskell 子表达式的编译时类型,因此运行时类型不必在 IO 中。

现在,要在不使用 unsafePerformIO 的情况下运行此命令,请使用runIO。然后,您必须自己构建 Expr,而不使用 [| |](这也解决了类型问题)。

实际上,如果你使用 [| |] 插入一个 IO 计算,我认为它只会插入计算,而不是运行它,无论如何。但这是无关紧要的,因为无论它做什么,这都不是做你想做的事情的正确方法。

于 2011-04-19T08:24:13.140 回答