为什么明确“需要”Shake 依赖项?
Why Shake dependencies are explicitly `needed`?
我发现第一个 example 的 Shake
用法演示了一个似乎容易出错的模式:
contents <- readFileLines $ out -<.> "txt"
need contents
cmd "tar -cf" [out] contents
当 readFileLines
读取它们并且 cmd
引用它们时,为什么我们需要 need contents
?这是为了避免要求 ApplicativeDo
?
我认为部分混淆可能是 contents
的 types/semantics。文件 out -<.> "txt"
包含文件名列表,因此 contents
是文件名列表。当我们 need contents
时,我们要求创建并依赖文件本身,使用文件名来指定哪些文件。当我们将 contents
传递给 cmd
时,我们传递的是 tar
将用于查询文件的文件名。
所以关键点是 readFileLines
不会读取有问题的文件,它只会从另一个文件中读取文件名。我们要使用need
来确定使用文件没问题,然后我们才真正使用cmd
中的文件。另一种查看三行的方法是:
- 我们要对哪些文件进行操作?
- 确保这些文件已准备就绪。
- 使用这些文件。
这有意义吗?与 ApplicativeDo
没有任何关系 - 它的存在对我们根本没有帮助。
我发现第一个 example 的 Shake
用法演示了一个似乎容易出错的模式:
contents <- readFileLines $ out -<.> "txt"
need contents
cmd "tar -cf" [out] contents
当 readFileLines
读取它们并且 cmd
引用它们时,为什么我们需要 need contents
?这是为了避免要求 ApplicativeDo
?
我认为部分混淆可能是 contents
的 types/semantics。文件 out -<.> "txt"
包含文件名列表,因此 contents
是文件名列表。当我们 need contents
时,我们要求创建并依赖文件本身,使用文件名来指定哪些文件。当我们将 contents
传递给 cmd
时,我们传递的是 tar
将用于查询文件的文件名。
所以关键点是 readFileLines
不会读取有问题的文件,它只会从另一个文件中读取文件名。我们要使用need
来确定使用文件没问题,然后我们才真正使用cmd
中的文件。另一种查看三行的方法是:
- 我们要对哪些文件进行操作?
- 确保这些文件已准备就绪。
- 使用这些文件。
这有意义吗?与 ApplicativeDo
没有任何关系 - 它的存在对我们根本没有帮助。