2

函数wantneed都要求它们的输入是 typeFilePath而不是FilePattern. 我的输出和输入的文件名遵循不同的模式,输出_build/*checker.sh和输入是./*.py. 因此我宁愿做一个want形式:

want ['_build/*checkers.sh']

want ['_build/dbchecker.sh', '_build/henk_checker.sh', ..., '_build/derp_checker.sh']

want我尝试通过组合来构建更复杂的东西,getDirectoryFiles, action, need但这不起作用,因为getDirectoryFiles返回Action [FilePath]而不是FilePath.

这个问题的正确解决方案是什么?

4

2 回答 2

2

Action,这是getDirectoryFiles返回的,似乎是 a Monad,所以你可以使用do-notation:

do
  paths <- getDirectoryFiles "" ["_build//*checkers.sh"]
  want paths

要不就

getDirectoryFiles "" ["_build//*checkers.sh"] >>= want

或者

want =<< getDirectoryFiles "" ["_build//*checkers.sh"]    

编辑:根据 Neil Mitchell 的评论,want需要替换为need.

于 2015-10-28T12:56:35.003 回答
1

事实证明, Erik 关于Action成为 monad 的评论非常有帮助。问题是动作已经存在于Rulesmonad 中——而不是相反(抱歉,Eric,不够具体)。下面的代码是关于我最终解决的。

import Development.Shake
import Development.Shake.Command
import Development.Shake.FilePath
import Development.Shake.Util

main :: IO ()
main = shakeArgs shakeOptions{shakeFiles="_build"} (do
  action $ do dependencies <- getDirectoryFiles "" ["*checker.py"]
              let scripts = map (\file -> "_build" </> file -<.> "sh") dependencies
              need scripts)
于 2015-10-28T13:56:38.270 回答