首先,我们将过滤功能分为:
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
,然后修改
主要的
这样就可以了:
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
里面
ISanotateDPDF
为了更清楚地说明下一步:
isAnnotatedPdf :: FilePath -> IO Bool
isAnnotatedPdf path = do
let pdfTitle = titleString (dir </> path)
return $ (isSubsequenceOf "annotated" pdfTitle) && (takeExtension path == ".pdf")
最后,改变
ISanotateDPDF
使用新的
输入输出
上下文而不是使用
unsafePerformIO
包装材料:
isAnnotatedPdf :: FilePath -> IO Bool
isAnnotatedPdf path = do
pdfTitle <- title (dir </> path)
return $ (isSubsequenceOf "annotated" pdfTitle) && (takeExtension path == ".pdf")
你完了!现在你可以摆脱
titleString
所有你提到的
不安全性能
.
作为奖励,你现在可以很容易地避免需要呼叫。
pdfInfo
通过移动纯
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