我希望在依赖文件更改时重新编译 TemplateHaskell 表达式,并且如果它不存在,请使用后备文件。但是一旦创建了依赖文件,我也想重新编译。
以下是示例代码:
import Control.Monad.Cont (MonadIO (liftIO))
import Language.Haskell.TH.Syntax (Lift (liftTyped))
import Language.Haskell.TH.Syntax.Compat (SpliceQ, liftSplice)
import System.Directory (doesFileExist)
myFn :: SpliceQ String
myFn =
let filePath = "...."
fallbackPath = "...."
in do
liftSplice (addDependentFile filePath >>= liftTyped)
exists <- liftIO (doesFileExist filePath)
let path = if exists then filePath else fallbackPath
... -- Then e.g. simply load the file using `path` and return contents
问题是,如果文件不存在,
addDependentFile
就会失败。如果我仅在 addDependentFile
为 exists
时运行 True
,一旦创建文件,它就不会重新编译。
如何实现这一目标? (如果无法实现,我也有一个解决方法 - 即一旦依赖文件不存在并且使用后备,则每次都重新编译。至少可以这样做吗?)