我发现Shake
使用的第一个example用于演示似乎容易出错的模式:
contents <- readFileLines $ out -<.> "txt"
need contents
cmd "tar -cf" [out] contents
为什么need contents
在读取readFileLines
并cmd
引用它们时需要ApplicativeDo
?这样我们可以避免要求 var members = req.body.members;
models.sequelize.transaction(function (t) {
for (var i = 0; i < members.length; i++) {
return models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}).then(function(user) {
return user.addInvitations([group], {transaction: t}).then(function(){}).catch(function(err){return next(err);});
})
};
}).then(function (result) {
console.log("YAY");
}).catch(function (err) {
console.log("NO!!!");
return next(err);
});
吗?
答案 0 :(得分:2)
我认为部分混淆可能是contents
的类型/语义。文件out -<.> "txt"
包含文件名列表,因此contents
是文件名列表。当我们need contents
时,我们需要创建和依赖文件本身,使用文件名来指定哪些文件。当我们将contents
传递给cmd
时,我们会传递tar
将用于查询文件的文件名。
所以关键点是readFileLines
不会读取有问题的文件,它只会从另一个文件中读取文件名。我们必须使用need
来确保使用这些文件很好,然后我们实际使用cmd
中的文件。查看这三行的另一种方法是:
这有意义吗?与ApplicativeDo
没有任何关系 - 它的存在根本无法帮助我们。