我的功能相对简单,并且使用相当标准的库:
{-# 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
的典型用法似乎有一个非常similar usage。我对向量的第二个错误也感到困惑。
可能的解决方法:
并不是真正的问题答案,但是我发现的一种解决方法(也更简洁)是在构建textToCSV
管道时替换了processCSV
函数和其他几个辅助函数:
processCSV :: (MonadResource m, MonadThrow m, PrimMonad m) =>
ConduitT FilePath Void m (Vector (Vector (MapRow Text)))
processCSV = mapMC (readCSVFile defCSVSettings) .| sinkVector