次の関数を見てください。readCSVFile :: :: (MonadResource m, CSV ByteString a) => CSVSettings -> FilePath -> m [a]
、および(別名)CSVSettings
などの が必要なだけなので、呼び出すのは比較的簡単です。defCSVSettings
FilePath
String
"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 つのうち、Text
Unicode を処理し、CSV にバイナリ データが含まれる可能性が低いため、推奨されます。ByteString
多かれ少なかれ a [Word8]
whileに似ていText
ます より似て[Char]
いる どちらがおそらくあなたが望むものです. したがって、(まだ動作しますが)するa
必要があります。Text
ByteString
これは、関数呼び出しの結果が であることを意味しますResourceT IO [Row Text]
。これでは多くのことはできませんが、ResourceT
はモナド変換子であるため、関数 を使用してモナド変換レイヤーから簡単に「ポップ」できますrunResourceT
。したがって、
readFile :: FilePath -> IO [Row Text]
readFile = runResourceT . readCSVFile defCSVSettings
これは、たとえば main 内で簡単に使用でき、次に aまたは a[Row Text]
で反復して個々の行を取得できます。map
fold
この種のものを GHCI で実行するには、型を明確に指定する必要があります。その理由は、結果クラスのインスタンスがどのパラメーターにも依存していないためです。したがって、 と の任意のセットについてCSVSettings
、それらが のインスタンスでありのインスタンスである限り、任意の数の異なる型を返すことがFilePath
できます。したがって、必要な型を GHCi に明示的に指定する必要があります。readCSVFile
m
MonadResource m
a
CSV ByteString a