为什么在使用csv-conduit时有时会出现“没有因使用`intoCSV`而产生的CSV文本文本实例”?

时间:2019-01-25 16:36:21

标签: haskell conduit

我的功能相对简单,并且使用相当标准的库:

{-# 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

0 个答案:

没有答案