从目录中获取文件的排序列表

时间:2012-05-16 18:56:55

标签: haskell

我想要一个目录中的文件排序列表。如何将sort函数应用于包含IO monad的列表?

import System.Directory 
import Data.List

sortedFiles :: FilePath -> IO [FilePath]
sortedFiles path = do
    files <- getDirectoryContents "."
    return sort files                   -- this does not work

3 个答案:

答案 0 :(得分:8)

最初的问题是缺少括号,因为目前return正在应用于两个参数(sortfiles),只需解决此问题:

sortedFiles path = do
    files <- getDirectoryContents "."
    return (sort files)

如果您希望可以fmap对目录内容进行排序功能。它有一种很好的,直接的感觉,基本上将排序功能提升到IO monad:

sortedFiles path = sort `fmap` getDirectoryContents path

答案 1 :(得分:4)

return函数不带两个参数。 (这有一个例外,但对初学者来说并不重要 - 它没有像你期望的那样做。)这是因为return是一个函数,而不是语法。函数的所有标准语法规则都适用于它。您希望传递返回sort files的结果,但这不是您正在使用的语法所说的。

您需要return (sort files)return $ sort files

两者完全相同。后者是稍微更惯用的Haskell。大多数人更喜欢使用$运算符来使用括号,当两者都是等效的可读时。

答案 2 :(得分:3)

其他人已经指出缺乏parens。

但这是一个更短,更易阅读的版本:

import System.Directory 
import Data.List
import Control.Applicative

sortedFiles :: FilePath -> IO [FilePath]
sortedFiles =  sort <$> getDirectoryContents