函数want和need都要求它们的输入类型为FilePath而不是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。
这个问题的适当解决办法是什么?
发布于 2015-10-28 13:56:38
埃里克关于Action是一个单曲的评论被证明是非常有用的。问题是操作已经驻留在Rules单子中--而不是相反(对不起,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-28 12:56:35
Action ( getDirectoryFiles返回的内容)似乎是一个Monad,因此您可以使用do-notation:
do
paths <- getDirectoryFiles "" ["_build//*checkers.sh"]
want paths或者只是
getDirectoryFiles "" ["_build//*checkers.sh"] >>= want或
want =<< getDirectoryFiles "" ["_build//*checkers.sh"] 编辑:根据Neil的评论,需要用need代替want。
https://stackoverflow.com/questions/33389889
复制相似问题