私はハスケルを学ぶJavaプログラマーです。 私は、特定のサフィックスを持つ単語のファイルを検索する小さなプログラムを作成しました。このコードをもっとコンパクトで読みやすくするには?
私はあなたの批判を読んでいます。 このコードをよりコンパクトで読みやすくするにはどうすればよいですか?
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
UPDATE:その他の修正:私は "hlint" を使用した2つの冗長スポット、
UPDATE 2 @yairchu感謝を修正しました。ありがとう@ephemient
更新3:少し修正。ありがとう@yairchu、あなたのコードのすべてを使用することはできません - Java開発者の心のためにあまりにも難しい
本当の質問ではありませんか? – maxwellb
この宿題はありますか? –
実装を作成し、他の人にあなたのためにそれをさせるのではなく、最適化の助けを頼むようにしてください。さもなければ、私はあなたのためにこれを開発するためにHaskellのプログラマーを雇うことを提案したいと思います。 – Lazarus