Почему иногда можно получить «Нет экземпляра для текстового текста CSV, возникающего из-за использования ʻ intoCSV`» при использовании CSV-проводника? - PullRequest
0 голосов
/ 25 января 2019

Моя функция относительно проста и использует довольно стандартные библиотеки:

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