最初に言及することはgetDirectoryFiles、同じ引数で複数回呼び出した場合need、同じファイルで複数回呼び出した場合に 1 回しかビルドされないのと同じように、1 回だけ計算されるということです。1つのアプローチは次のとおりです。
"out/*.fwd" *> \out -> do
res <- getDirectoryFiles "src" ["*.txt"]
let match = [(takeBaseName out ++ "-") `isPrefixOf` takeBaseName x | x <- res]
when (length match /= 1) $ error "fail, because wrong number of matches"
writeFileChanged out $ head match
"out/*.html" *> \out -> do
src <- readFile' (out -<.> "fwd")
txt <- readFile' ("src" </> src)
...
ここでの考え方は、ファイルout/123.txtにコンテンツが含まれているということ123-some-title.txtです。を使用することで、ディレクトリの関連部分が変更されたときにwriteFileChangedのみファイルを変更します。.fwd
.fwdファイルを回避したい場合は、Oracleメカニズムを使用できます。getDirectoryFiles結果の線形スキャンを避けたい場合は、newCache関数を使用できます。実際には、どちらも問題になる可能性は低く、ファイルを使用するのがおそらく最も簡単です。