{-# LANGUAGE OverloadedStrings #-} import qualified Data.ByteString.Lazy as BL import Data.Csv import qualified Data.Vector as V data Person = Person { name :: String , salary :: Int } valueParse :: NamedRecord -> Parser Person valueParse r = Person <$> r .: "name" <*> r .: "salary" main :: IO () main = do csvData <- BL.readFile "salaries.csv" case decodeByNameWithP valueParse defaultDecodeOptions csvData of Left err -> putStrLn err Right (_, v) -> V.forM_ v $ \ p -> putStrLn $ name p ++ " earns " ++ show (salary p) ++ " dollars"