我发现第一个使用示例Shake展示了一种似乎容易出错的模式:
contents <- readFileLines $ out -<.> "txt"
need contents
cmd "tar -cf" [out] contents
为什么我们需要need contents阅读readFileLines它们并cmd引用它们?这样我们可以避免要求ApplicativeDo吗?
我发现第一个使用示例Shake展示了一种似乎容易出错的模式:
contents <- readFileLines $ out -<.> "txt"
need contents
cmd "tar -cf" [out] contents
为什么我们需要need contents阅读readFileLines它们并cmd引用它们?这样我们可以避免要求ApplicativeDo吗?
我认为部分混淆可能是contents. 该文件out -<.> "txt"包含文件名列表,文件名列表也是如此contents。当我们need contents要求创建和依赖文件本身时,使用文件名来指定哪些文件。当我们传递contents给时,cmd我们传递tar将用于查询文件的文件名。
所以关键是它readFileLines不读取有问题的文件,它只从另一个文件中读取文件名。我们必须使用need确保使用文件是好的,然后我们实际使用cmd. 查看这三行的另一种方法是:
那有意义吗?没有任何关系ApplicativeDo——它的存在对我们毫无帮助。