Je suis un programmeur Java qui apprend Haskell. J'ai écrit un petit programme qui recherche dans les fichiers des mots avec un suffixe particulier.Comment rendre ce code plus compact et plus lisible?
J'aimerais lire votre critique. Que proposeriez-vous pour rendre ce code plus compact et plus lisible?
module Main where
import Control.Monad
import Data.String.Utils
import Data.List
import Data.Char
import System.Directory
import System.FilePath
import System.IO
import System.IO.HVFS.Utils
import Text.Regex
alphaWords :: String -> [String]
alphaWords = words . map (\c -> if isAlpha c then c else ' ') -- by ephemient
-- was:
-- words2 s = case dropWhile isSpace2 s of
-- "" -> []
-- ss -> w : words2 sss
-- where (w, sss) = break isSpace2 ss
-- where isSpace2 = not . isAlpha
findFiles :: FilePath -> IO [FilePath]
findFiles path = do
cur_path <- getCurrentDirectory
files <- recurseDir SystemFS $ normalise $ combine cur_path path
filterM doesFileExist files
wordsWithSuffix :: String -> String -> [String]
wordsWithSuffix suffix text =
let tokens = (nub . alphaWords) text
endswithIgnoringCase = endswith suffix . map toLower
in filter endswithIgnoringCase tokens
searchWords :: String -> String -> [String] -> IO [String]
searchWords suffix path exts = do
let isSearchable = (`elem` exts) . takeExtension -- by yairchu
--was let isSearchable s = takeExtension s `elem` exts
--files <- filterM (fmap isSearchable) $ findFiles path -- by ephemient (compile error)
files <- liftM (filter isSearchable) $ findFiles path
wordsPerFile <- forM files $ fmap (wordsWithSuffix suffix) . readFile -- by ephemient
-- was: wordsPerFile <- forM files (\x -> liftM (wordsWithSuffix suffix) (readFile x))
return . sort . nub $ concat wordsPerFile -- by ephemient
-- was: return $ (sort . nub . concat) wordsPerFile
main = do
words <- searchWords "tick" "/path/to/src" [".as", ".java", ".mxml"]
print $ length words
putStrLn $ unlines words
MISE À JOUR: J'ai corrigé 2 points verbeux trouvés en utilisant "hlint", thanks
MISE À JOUR 2: Plus correctifs. Merci @ephemient
MISE À JOUR 3: Un petit correctif. Merci @yairchu, ne peut pas utiliser tout votre code - trop difficile pour l'esprit d'un développeur Java
pas une vraie question? – maxwellb
Est-ce que ce sont les devoirs? –
Essayez d'écrire une implémentation, puis demandez de l'aide pour optimiser plutôt que d'essayer d'amener les autres à le faire pour vous. Sinon, je suggère d'embaucher un programmeur Haskell pour développer cela pour vous. – Lazarus