2017-11-17 3 views
0

haskell은 두 번째에서 네 번째 행을 목록으로 출력하기 위해 헤더 (유형 문자열)가있는 int의 csv 파일을 가져 오려고합니다. 예를 들어, [[row, 1], [row, 2] ..] 지금까지 Pipes 라이브러리를 사용하여 번호가 문자열 인 목록으로 각 행을 출력하도록 만들었고 어떤 이유로 "Right"를 인쇄합니까? 예 : 출력 : '오른쪽 [ "1", "3", "5"..]'새 줄 '오른쪽 [ "32", "38", "45"]'. 모든 제안을 부탁드립니다. 코드 :하스켈 : 목록의 헤더를 포함하는 csv

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

답변

1

나는 Pipe에 익숙하지 해요,하지만 당신은 통상적으로 데이터에 대한 Right 생성자 및 오류 메시지에 대한 Left 생성자를 사용하는 Either, 속으로 데이터를 당기는 것 같습니다. 당신이 Either String (V.Vector Text.Text)를 구축하고이 경우

data Either a b = Left a | Right b 

, 그래서 당신의 결과가 될 것입니다 중 하나

:: Left String 

또는 후자를 받고있어이 경우

:: Right (V.Vector Text.Text) 

하고, show 값을 Either 모나드에서 뺍니다. either을 사용하여 한 번에 두 가지 가능성을 모두 처리 할 수 ​​있습니다 ( Maybe 모나드에서 maybe을 사용하는 것과 거의 같은 방식).

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 

이 검사는 x 따라 Left a 또는 Right b 반환하거나 또는 id ashow b 경우. either는 다시 main

+0

덕분에 인쇄 할 수있는 String를 산출한다

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 

하나의 (a 혁) 방법을 입력합니다! 매우 유용한 정보. –