Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"ERROR - C stack overflow" in Haskell using Hugs

I'm working on parsing a CSV file into a CSV type which is a list of Record which is a list of Field, which are just Strings. After inserting a new row and then trying to access the csv I get the c stack overflow error. I'v read this error may come from too large a "thunk" by using tail recursion but I don't think thats what I'm doing wrong?

type CSV = [Record]
type Record = [Field]
type Field = String

run :: IO()
run =
 do
  inFile <- readFile "myFile.csv"
  let csv = parse inFile
  let csv = (insertRow "abc,def,ghi" csv)
  putStr (show csv)

insertRow :: String -> CSV -> CSV
insertRow newRow csv = csv ++ [toRecord newRow]

parse :: String -> CSV
parse file = map toRecord (parseLines file "" [])

toRecord :: String -> Record
toRecord line = parseWords line "" []

-- parseLine input partialCSV records
parseLines :: String -> String -> [String] -> [String]
parseLines [] partial records = records ++ [partial]
parseLines ('\r':xs) partial records = parseLines xs [] (records ++ [partial])
parseLines (x:xs) partial records = parseLines xs (partial ++ [x]) records

-- parseWords input partialRecord fields
parseWords :: String -> String -> [String] -> [String]
parseWords [] partial fields = fields ++ [partial]
parseWords ('"':xs) partial fields = parseQuotes xs partial fields
parseWords (',':xs) partial fields = parseWords xs [] (fields ++ [partial])
parseWords (x:xs) partial fields = parseWords xs (partial ++ [x]) fields

parseQuotes :: String -> String -> [String] -> [String]
parseQuotes ('"':xs) partial fields = parseWords xs [] (fields ++ [partial])
parseQuotes (x:xs) partial fields = parseQuotes xs (partial ++ [x]) fields
like image 979
user1130083 Avatar asked Jan 04 '12 14:01

user1130083


2 Answers

let bindings are recursive, so this line

let csv = (insertRow "abc,def,ghi" csv)

creates an infinite loop, you're defining csv in terms of itself in a way that doesn't terminate. Change it to

let csv' = ...

and print csv' in the next line.

like image 185
Daniel Fischer Avatar answered Sep 22 '22 12:09

Daniel Fischer


The double let csv = ... looks suspicious. Could you try disentangling the two variables? It probably doesn't do what you want (in Haskell let is recursive).

like image 42
Volker Stolz Avatar answered Sep 19 '22 12:09

Volker Stolz