首先,让我们拆分一下过滤功能:
isAnnotatedPdf :: FilePath -> Bool
isAnnotatedPdf path = (isSubsequenceOf "annotated" (titleString (dir </> path))) && (takeExtension path == ".pdf")
main :: IO ()
main = do
print =<<
liftM
(filter isAnnotatedPdf)
(listDirectory dir)
现在,使用一些语法糖来清理main
:
main :: IO ()
main = do
dirList <- listDirectory dir
let filteredList = filter isAnnotatedPdf dirList
print filteredList
接下来,改变isAnnotatedPdf
返回其结果IO
,然后修改main
这样就可以这样做:
isAnnotatedPdf :: FilePath -> IO Bool
isAnnotatedPdf path = do
return $ (isSubsequenceOf "annotated" (titleString (dir </> path))) && (takeExtension path == ".pdf")
main :: IO ()
main = do
dirList <- listDirectory dir
filteredList <- filterM isAnnotatedPdf dirList
print filteredList
提取变量pdfTitle
inside isAnnotatedPdf
为了让下一步更加清晰:
isAnnotatedPdf :: FilePath -> IO Bool
isAnnotatedPdf path = do
let pdfTitle = titleString (dir </> path)
return $ (isSubsequenceOf "annotated" pdfTitle) && (takeExtension path == ".pdf")
最后,改变isAnnotatedPdf
使用其新的IO
上下文而不是使用你的unsafePerformIO
包装:
isAnnotatedPdf :: FilePath -> IO Bool
isAnnotatedPdf path = do
pdfTitle <- title (dir </> path)
return $ (isSubsequenceOf "annotated" pdfTitle) && (takeExtension path == ".pdf")
你就完成了!现在你可以摆脱titleString
以及你所有的参考文献unsafePerformIO
.
作为奖励,您现在可以轻松避免致电pdfInfo
对于非 PDF 的内容,通过移动纯takeExtension
在单子标题检查之前检查,如下所示:
isAnnotatedPdf :: FilePath -> IO Bool
isAnnotatedPdf path = if takeExtension path == ".pdf"
then do
pdfTitle <- title (dir </> path)
return $ isSubsequenceOf "annotated" pdfTitle
else return False
或者使用<$>
代替do
:
isAnnotatedPdf :: FilePath -> IO Bool
isAnnotatedPdf path = if takeExtension path == ".pdf"
then isSubsequenceOf "annotated" <$> title (dir </> path)
else return False