我想要一个目录中的文件排序列表。如何将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
答案 0 :(得分:8)
最初的问题是缺少括号,因为目前return
正在应用于两个参数(sort
和files
),只需解决此问题:
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