Hãy nhìn vào các chức năng sau đây: readCSVFile :: :: (MonadResource m, CSV ByteString a) => CSVSettings -> FilePath -> m [a]
của nó tương đối đơn giản để gọi, như chúng ta chỉ cần một CSVSettings
, chẳng hạn như defCSVSettings
, và một FilePath
(aka String
), "file.csv"
hay một cái gì đó.
Do đó, sau cuộc gọi, chúng tôi nhận được (MonadResource m, CSV ByteString a)
. Chúng ta có thể giải quyết vấn đề này tại một thời điểm để tìm ra một loại thích hợp cho việc này. Chúng tôi đang thực hiện IO
trong thao tác này, vì vậy đối với MonadResource m
, m
chỉ nên là ResourceT IO
, xảy ra là một phiên bản của MonadBaseControl IO
theo yêu cầu của runResourceT
. Đây là một điều đặc biệt là conduit
.
Đối với CSV ByteString a
, chúng tôi cần tìm các phiên bản của CSV
. Để làm như vậy, hãy truy cập http://hackage.haskell.org/packages/archive/csv-conduit/0.2.1.1/doc/html/Data-CSV-Conduit.html#t:CSV (trong đó tài liệu dành cho gói theo ý kiến của tôi có phần hơi đáng ghét khi được nhồi vào hộp đánh chữ ...) và nhấp vào Trường hợp để xem các trường hợp có sẵn của chúng tôi có dạng CSV ByteString a
. Hai tùy chọn là CSV ByteString ByteString
và CSV ByteString Text
.
Trong số hai trường hợp này, Text
thích hợp hơn vì nó xử lý unicode và CSV không có khả năng chứa dữ liệu nhị phân. ByteString
ít nhiều giống với [Word8]
trong khi Text
tương tự với [Char]
, đó có thể là những gì bạn muốn. Do đó, a
phải là Text
(mặc dù ByteString
sẽ vẫn hoạt động).
Điều này có nghĩa là kết quả của cuộc gọi hàm là ResourceT IO [Row Text]
. Chúng tôi không thể làm gì nhiều với điều này, nhưng vì ResourceT
là một biến thể đơn nguyên, chúng tôi có thể dễ dàng "bật" ra khỏi lớp chuyển đổi đơn nguyên với hàm runResourceT
. Như vậy,
readFile :: FilePath -> IO [Row Text]
readFile = runResourceT . readCSVFile defCSVSettings
mà có thể dễ dàng sử dụng được trong vòng, nói rằng, chính để có được tại [Row Text]
mà sau đó bạn có thể lặp lại với một map
hoặc một fold
để có được bàn tay của bạn trên hàng riêng lẻ.
Để chạy loại điều này trong GHCI, bạn hoàn toàn phải chỉ ra loại đó. Lý do là cá thể lớp kết quả không phụ thuộc vào bất kỳ tham số nào; do đó, đối với bất kỳ bộ nào của CSVSettings
và FilePath
, readCSVFile
có thể trả lại bất kỳ số nào các loại khác nhau miễn là chúng là m
là một phiên bản MonadResource m
và a
là một phiên bản CSV ByteString a
. Vì vậy, chúng tôi phải chỉ rõ GHCi là loại bạn muốn.
với gói csv-ống dẫn-0.6.6 readCsv chữ ký nên được 'readCsv :: String -> Char -> IO (V.Vector (Row B.ByteString))', thay thế Row Text with Row B. ByteString – Janthelme