2017-01-31 5 views
0

私はHaskellを初めて使用しています。私はモナドに精通していますが、熟練していません。私はディレクトリの内容を取得して戻しています。今は、ディレクトリであるファイルと、存在しないファイルを分離する必要があります。System.Directoryを使用してファイルとディレクトリを別々に抽出

System.Directoryは、私はすでに、ディレクトリの内容を返す関数を作成している

doesFileExist :: FilePath -> IO Bool 

と呼ばれる機能があります。ここに型シグニチャがあります:

ここで、ペアを返す関数を作成します。ペアの最初の要素は、ディレクトリではないファイルパスのみを含む必要があります。 2番目のファイルにはディレクトリであるファイルパスのみが含まれていなければなりません。

機能与え、要約すると:

doesFileExist :: FilePath -> IO Bool 
getListOfFiles :: FilePath -> IO (Either IOException [FilePath]) 

私は関数を得ることができる方法:

getFilesAndDirs :: (FilePath -> IO (Either IOException [FilePath]), FilePath -> IO (Either IOException [FilePath])) 

ペアの最初の要素がディレクトリでないファイルのみが含まれている必要があります。 2番目のディレクトリにはディレクトリのみが含まれている必要があります。 doesFileExist関数は、ファイルがディレクトリかどうかを判断するのに役立ちます。

私はハスケルを初めて使っているので、私はこれをコード化することが非常に難しいと感じました。私は多くのことを試しましたが、タイプエラーに遭遇します。

+2

"私は多くのことを試みましたが、タイプエラーが発生しました。" - どのような?スタックオーバーフローではなく、最初からあなたのための関数全体を書くように要求して、あなたが試したことをいくつか、それらを試している間に遭遇したことを示してください。 – amalloy

+0

@amalloy、私は問題を理解していますが、私はそれを修正する方法を知らない - 私はハスケルの初心者です。私は '[FilePath]'のデータを持っていれば、 'doesFileExist :: FilePath-> IO Bool'関数を使って' IO Bool 'を出力することができます。しかし、私のデータは '[FilePath]'ではありません。その 'IO [FilePath]'。私の知る限りでは、私のデータはモナドの中にあるモナドに囲まれています(私の場合、IOモナドはリストモナドをラップします)。そのデータに関数を適用するには何らかの方法が必要だと思います。 –

+0

ファイルパスとファイルパスを区別する必要がある場合は、 'path-io'パッケージ、特に' 'listDir'(http://hackage.haskell.org)を見てみることをお勧めします/package/path-io-1.2.2/docs/Path-IO.html#v:listDir)関数を使用します。 – sjakobi

答えて

0

、このようなペアの第一の成分は

getOnlyFiles :: FilePath -> IO (Either IOException [FilePath]) 
getOnlyFiles fp = do 
    efs <- getListOfFiles fp 
    case efs of 
     Left err -> return (Left err) 
     Right fs -> Rigth <$> filterM doesFileExist fs 

ような何か第二の成分は、あなたがfmap not . doesFileExist代わりのdoesFileExistをしたい除いて、同じである必要があります。

ただし、このようなペアを使用すると、ディレクトリを2回スキャンする必要があります。ライブラリは、我々はそれを悪用する可能性がありますpartitionM提供されている場合、より良いデザインは、IMO、

getFilesAndDirs :: FilePath -> IO (Either IOException ([FilePath],[FilePath])) 

ような(ラップ)のペアを返す関数を使用することになります。残念ながらそうではありませんが、私たちは常にそれを自分で定義することができます。

関連する問題