Моя функция относительно проста и использует довольно стандартные библиотеки:
{-# LANGUAGE OverloadedStrings #-}
module Foo where
import Conduit
import Data.CSV.Conduit
textToCSV :: Text -> Vector (MapRow Text)
textToCSV txt = replicateC 1 txt
.| intoCSV defCSVSettings
.| sinkVector & runConduitPure & runIdentity
Я хотел бы понять, почему я получаю эти ошибки типа, и решение было бы также замечательно:
* No instance for (CSV Text (Vector (MapRow Text)))
arising from a use of `intoCSV'
* In the first argument of `(.|)', namely `intoCSV defCSVSettings'
In the second argument of `(.|)', namely
`intoCSV defCSVSettings .| sinkVector'
In the first argument of `(&)', namely
`replicateC 1 txt .| intoCSV defCSVSettings .| sinkVector'
|
156 | .| intoCSV defCSVSettings
| ^^^^^^^^^^^^^^^^^^^^^^
* No instance for (Data.Vector.Generic.Base.Vector
Identity (Vector (MapRow Text)))
arising from a use of `sinkVector'
* In the second argument of `(.|)', namely `sinkVector'
In the second argument of `(.|)', namely
`intoCSV defCSVSettings .| sinkVector'
In the first argument of `(&)', namely
`replicateC 1 txt .| intoCSV defCSVSettings .| sinkVector'
|
157 | .| sinkVector & runConduitPure & runIdentity
| ^^^^^^^^^^
Конечно, я могу согласиться с тем, что экземпляр CSV Text Text
не существует. Но по сравнению с тем, что я делаю, типичное использование sourceFile
, похоже, очень аналогично . Я так же озадачен второй ошибкой, касающейся векторов.
Возможное решение :
Не совсем ответ на вопрос, но я нашел обходной путь (который также более лаконичен), чтобы заменить мою textToCSV
функцию и несколько других вспомогательных функций в конструкции моего processCSV
канала:
processCSV :: (MonadResource m, MonadThrow m, PrimMonad m) =>
ConduitT FilePath Void m (Vector (Vector (MapRow Text)))
processCSV = mapMC (readCSVFile defCSVSettings) .| sinkVector