Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell解析csv,并将标题添加到列表_Csv_Haskell_List Comprehension - Fatal编程技术网

Haskell解析csv,并将标题添加到列表

Haskell解析csv,并将标题添加到列表,csv,haskell,list-comprehension,Csv,Haskell,List Comprehension,haskell尝试获取一个带有标题(类型字符串)的int的csv文件,以将第2到第n行输出到列表列表中,这是一个新手。例如[[第1行],[第2行]…] 到目前为止,Pipes库让它以列表的形式输出每一行,数字作为字符串,出于某种原因,它打印“Right”?。例如输出:“右[“1”、“3”、“5”。]“新行”右[“32”、“38”、“45”]”。如有任何建议,将不胜感激。代码: {-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-} impo

haskell尝试获取一个带有标题(类型字符串)的int的csv文件,以将第2到第n行输出到列表列表中,这是一个新手。例如[[第1行],[第2行]…] 到目前为止,Pipes库让它以列表的形式输出每一行,数字作为字符串,出于某种原因,它打印“Right”?。例如输出:“右[“1”、“3”、“5”。]“新行”右[“32”、“38”、“45”]”。如有任何建议,将不胜感激。代码:

{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
import qualified Data.Vector as V
import Pipes
import qualified Pipes.Prelude as P
import qualified System.IO as IO
import qualified Pipes.ByteString as PB
import qualified Data.Text as Text
import qualified Pipes.Csv as PCsv
import Control.Monad (forever)

showPipe :: Proxy () (Either String (V.Vector Text.Text)) () String IO b
showPipe = forever $ do
    x::(Either String (V.Vector Text.Text)) <- await
    yield $ show x

main :: IO ()
main = do
    putStrLn "Filename? "
    fName <- getLine 
    IO.withFile fName
                IO.ReadMode
                (\handle -> do
                    let producer = (PCsv.decode PCsv.NoHeader 
(PB.fromHandle handle))
                    runEffect ( (producer)>->
                                (showPipe) >->
                                P.stdoutLn)
                )
{-#语言重载字符串,ScopedTypeVariables}
导入符合条件的数据。向量为V
导入管道
进口合格管道。前奏部分为P
将合格的System.IO导入为IO
导入合格管道。通过测试环作为PB
导入符合条件的数据。文本作为文本
将合格管道.Csv导入为PCsv
进口管制.单子(永远)
showPipe::Proxy()(任意字符串(V.Vector Text.Text))()字符串IO b
showPipe=forever$do
x::(任意字符串(V.Vector Text.Text))->
(表演者)>->
P.stdoutLn)
)

我不熟悉
管道
,但看起来您正在将数据拉入
,这通常使用
右侧
构造函数表示数据,使用
左侧
构造函数表示错误消息

data Either a b = Left a | Right b
在本例中,您正在构建一个
任意字符串(V.Vector Text.Text)
,因此您的结果将是:

:: Left String

在本例中,您得到的是后者,并且希望
显示从
monad中提取的值。您可以使用
同时处理这两种可能性(与
maybe
单子中使用
maybe
的方式大致相同)

无论是哪种(hyuk)方式,您都应该生成一个
字符串
以在
main

:: Right (V.Vector Text.Text)
showPipe :: Proxy () (Either String (V.Vector Text.Text)) () String IO b
showPipe = forever $ do
    x::(Either String (V.Vector Text.Text)) <- await
    let v = either id show x
    yield v
either :: (a -> c) -> (b -> c) -> Either a b -> c
-- or, specialized for this case:
either :: (String -> String)
           -> ((V.Vector Text.Text) -> String)
           -> Either String (V.Vector Text.Text)
           -> String