0

ディレクトリからのファイルのソートされたリストが必要です。モナドsortを持つリストに関数を適用するにはどうすればよいですか?IO

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元の問題は、現在2 つの引数 (sortおよび) に適用されているため、括弧が不足しているfilesだけです。それを修正してください。

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

fmap必要に応じて、ディレクトリの内容に対してソート機能を使用できます。基本的に、並べ替え関数を IO モナドに持ち上げます。

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

このreturn関数は 2 つの引数を取りません。(これには例外がありますが、初心者にとっては重要ではありません。期待するようなことは何もしません。) これは、returnが構文ではなく関数であるためです。関数のすべての標準構文規則が適用されます。の結果を渡したいsort filesのですが、使用している構文ではそうではありません。

return (sort files)またはのいずれかが必要return $ sort filesです。

2つはまったく同等です。後者はやや慣用的な 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 に答える