次の関数を見てください。readCSVFile :: :: (MonadResource m, CSV ByteString a) => CSVSettings -> FilePath -> m [a]
、および(別名)CSVSettingsなどの が必要なだけなので、呼び出すのは比較的簡単です。defCSVSettingsFilePathString"file.csv"
したがって、呼び出しの後、 が得られ(MonadResource m, CSV ByteString a)ます。これを 1 つずつ解決して、これに適した型を見つけます。IOこの操作を実行しているので、 forMonadResource mは でmある必要がありResourceT IO、これはたまたまMonadBaseControl IOによって必要とされる のインスタンスになりますrunResourceT。これはconduit具体的なことです。
についてはCSV ByteString a、 のどのインスタンスを見つける必要がありますCSV。これを行うには、http://hackage.haskell.org/packages/archive/csv-conduit/0.2.1.1/doc/html/Data-CSV-Conduit.html#t:CSV (パッケージのドキュメント私の意見では、やや不愉快なことに、すべてが型クラスに詰め込まれています...)そしてインスタンスをクリックして、フォームの使用可能なインスタンスを確認しますCSV ByteString a。との 2 つのオプションがCSV ByteString ByteStringありCSV ByteString Textます。
これらの 2 つのうち、TextUnicode を処理し、CSV にバイナリ データが含まれる可能性が低いため、推奨されます。ByteString多かれ少なかれ a [Word8]whileに似ていTextます より似て[Char]いる どちらがおそらくあなたが望むものです. したがって、(まだ動作しますが)するa必要があります。TextByteString
これは、関数呼び出しの結果が であることを意味しますResourceT IO [Row Text]。これでは多くのことはできませんが、ResourceTはモナド変換子であるため、関数 を使用してモナド変換レイヤーから簡単に「ポップ」できますrunResourceT。したがって、
readFile :: FilePath -> IO [Row Text]
readFile = runResourceT . readCSVFile defCSVSettings
これは、たとえば main 内で簡単に使用でき、次に aまたは a[Row Text]で反復して個々の行を取得できます。mapfold
この種のものを GHCI で実行するには、型を明確に指定する必要があります。その理由は、結果クラスのインスタンスがどのパラメーターにも依存していないためです。したがって、 と の任意のセットについてCSVSettings、それらが のインスタンスでありのインスタンスである限り、任意の数の異なる型を返すことがFilePathできます。したがって、必要な型を GHCi に明示的に指定する必要があります。readCSVFilemMonadResource maCSV ByteString a