我想基於正則表達式篩選[[String]]。過濾[[String]]與正則表達式和模式匹配
filter (\fn -> case (matchRegex (mkRegex "*.exe") fn) of Nothing -> False
Just _ -> True)
directory_info
不幸的是,這裏的lambda函數在語法上是無效的:根據ghc,表達式上下文中不會出現模式匹配。
這應該如何改寫以簡潔地執行預期的含義?
我想基於正則表達式篩選[[String]]。過濾[[String]]與正則表達式和模式匹配
filter (\fn -> case (matchRegex (mkRegex "*.exe") fn) of Nothing -> False
Just _ -> True)
directory_info
不幸的是,這裏的lambda函數在語法上是無效的:根據ghc,表達式上下文中不會出現模式匹配。
這應該如何改寫以簡潔地執行預期的含義?
爲什麼在有System.FilePath
時使用正則表達式?在這種情況下,請嘗試使用takeExtension
函數。
filter (\fn -> takeExtension fn == ".exe") directory_info
絕對是最好的方法。在這種情況下,正則表達式不是最好的工具。 – AndrewC
如果您只有在匹配時纔有興趣,可以使用matchTest
而不是matchRegex
。
首先,你的正則表達式是錯誤的。它應該是".*\\.exe"
。你使用的是所謂的globbing。
其次,嘗試使用=~
語法代替,例如here。
例如,這應該工作:
filter (\fn -> fn =~ ".*\\.exe" :: Bool) directory_info
而且,你不必使用lambda。把它變成一個功能,它可能會工作。
我不從,爲什麼你得到錯誤從代碼理解(我會用哈馬爾的答案反正去),但你可以通過使用'從Data.Maybe isJust'避免模式匹配。 – dave4420