0

我想要一个目录中的文件排序列表。如何将sort函数应用于带有IOmonad 的列表?

import System.Directory 
import Data.List

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

3 回答 3

8

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

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

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

sortedFiles path = sort `fmap` getDirectoryContents path
于 2012-05-16T19:01:36.413 回答
4

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

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

两者完全等价。后者是稍微惯用的 Haskell。大多数人更喜欢使用$运算符而不是括号,因为两者都具有同等的可读性。

于 2012-05-16T19:00:47.740 回答
3

其他人已经指出缺乏括号。

但这里有一个更短、更易读的版本:

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

sortedFiles :: FilePath -> IO [FilePath]
sortedFiles =  sort <$> getDirectoryContents
于 2012-05-16T20:57:31.133 回答