CSVファイルをCSV形式に解析しています.CSV形式はRecordのリストで、Fieldのリストです。新しい行を挿入した後、csvにアクセスしようとすると、Cのスタックオーバーフローエラーが発生します。私はこのエラーを読んで、尾の再帰を使用することによってあまりにも大きな "サンク"から来るかもしれないが、私は間違っていることをthatsとは思わない?HaskellのHaskellで "ERROR-C stack overflow"が発生しました
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
あなたの問題とは無関係に、ハグの最後のリリースは5歳以上です。言語はさらに進化し、ghciのパフォーマンスも向上します(そしてコンパイラも付属しています)。悲しいですが、私はもうハグを使わないことを勧めます(誰かがそれを復活させるまで)。 –