Haskell 我可以使用NamedRecords设置导管CSV的列顺序吗?

Haskell 我可以使用NamedRecords设置导管CSV的列顺序吗?,haskell,conduit,Haskell,Conduit,我的代码如下。看起来数据是以随机顺序输出的,这很有意义,因为NamedRecord只是一个Map。有什么方法可以强制执行特定的命令吗 我认为一种选择是创建一个类型为导管(命名为a)m(行文本)的导管,但这似乎是一个足够常见的用例,标准的东西应该已经存在了 processor :: Monad m => Conduit (Named FalconRow) m (Named HefRow) processor = do value <- await case value of

我的代码如下。看起来数据是以随机顺序输出的,这很有意义,因为
NamedRecord
只是一个
Map
。有什么方法可以强制执行特定的命令吗

我认为一种选择是创建一个类型为
导管(命名为a)m(行文本)
的导管,但这似乎是一个足够常见的用例,标准的东西应该已经存在了

processor :: Monad m => Conduit (Named FalconRow) m (Named HefRow)
processor = do
  value <- await 
  case value of
    Nothing -> return ()
    Just v -> do
      let transformed = (fixRow . getNamed) v
      CL.sourceList $ Prelude.map Named transformed

runTranslation :: IO ()
runTranslation = runResourceT $ 
  transformCSV defCSVSettings 
               (sourceFile "input.csv") 
               processor
               (sinkFile "output.csv")
处理器::Monad m=>导管(名为FalconRow)m(名为HefRow) 处理器=do 返回值() 只要v->do 让transformed=(fixRow.getNamed)v CL.sourceList$Prelude.map名为transformed runTranslation::IO() runTranslation=runResourceT$ 转换偏移设置 (源文件“input.csv”) 处理器 (文件“output.csv”)
我最终只是为这个做了自己的功能:

sortColumns :: (Monad m, DefaultOrdered a, ToNamedRecord a) => Conduit (Named a) m (Row ByteString)
sortColumns = CL.map doSort

doSort :: (DefaultOrdered a, ToNamedRecord a) => Named a -> Row ByteString
doSort value =
  let columnMap = toNamedRecord $ getNamed value
      headers = toList $ headerOrder $ getNamed value
      bsValue = map (\title -> findWithDefault "" title columnMap) headers
  in  bsValue

我最终只是为这个做了自己的功能:

sortColumns :: (Monad m, DefaultOrdered a, ToNamedRecord a) => Conduit (Named a) m (Row ByteString)
sortColumns = CL.map doSort

doSort :: (DefaultOrdered a, ToNamedRecord a) => Named a -> Row ByteString
doSort value =
  let columnMap = toNamedRecord $ getNamed value
      headers = toList $ headerOrder $ getNamed value
      bsValue = map (\title -> findWithDefault "" title columnMap) headers
  in  bsValue