如何将readFile“filename.txt”生成的输出字符串传递给Haskell的单词作为参数?

时间:2017-07-18 21:23:36

标签: haskell readfile ghci

来自ghci>提示符,我想 readFile “filename.text”并将生成的字符串作为参数传递给 words 函数进行转换句子单词列表。

由于

1 个答案:

答案 0 :(得分:2)

您可以在readFile返回的IO monad“内部”执行纯函数(单词)。

readFile :: FilePath -> IO String

words :: String -> [String]

所以你可以简单地做

fmap words $ readFile "filename.txt" 

,其类型为IO [String]。如果你在ghci(它本身就是IO monad的“内部”)中执行此操作,您将显示单词列表。

编辑:

如果您想应用多个转换,您可能希望干净地分离纯部分(基于@ Davislor的解决方案和评论):

readFile "filename.txt" >>= (return . sort . words) >>= mapM_ putStrLn

此处的return只需升级到IO,您只需将return替换为mapM_ putStrLn(排序器,但不太清晰的区别)。

另一种解决方案可能是应用风格:

sort <$> words <$> readFile "filename.txt"  >>= mapM_ putStrLn

或使用do notation(命令式):

do ; f <- readFile  "filename.txt"; let out = sort (words f) in  mapM_ putStrLn out

(这很难看,因为我使用了;而不是换行符)或者只是(不那么强制性地:):

do ; f <- readFile "filename.txt";  mapM_ putStrLn $ sort $ words f