user1130083
user1130083

Reputation: 61

"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

Upvotes: 6

Views: 605

Answers (2)

Daniel Fischer
Daniel Fischer

Reputation: 183968

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.

Upvotes: 5

Volker Stolz
Volker Stolz

Reputation: 7402

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).

Upvotes: 2

Related Questions