1

テキスタイルにインデックスを付ける再帰関数があり、それを巨大なテキストファイルに使用すると、スタックスペースがオーバーフローします。再帰部分をlet部分に入れたので、このスタックスペースのオーバーフローを回避できると思いましたが、まだ取得しています。この関数でスタックスペースのオーバーフローを回避するための最良の方法は何でしょうか?

--lines to Map

parseLinesToWordEntryMap :: Int -> [String] -> M.Map Word [TextLocation] -> (M.Map Word [TextLocation])
parseLinesToWordEntryMap lineNumber [] wordEntryMap  = wordEntryMap
parseLinesToWordEntryMap lineNumber (x:xs) wordEntryMap =
    let
         lineNumber' = lineNumber-1
         wordEntryMapRec = parseLinesToWordEntryMap lineNumber' xs wordEntryMap
    in
         parseLineToWordEntryMap lineNumber x wordEntryMapRec
4

1 に答える 1

7

あなたが持っているのは本質的に正しい折り目です、

parseLinesToWordEntryMap lineNumber xs wordEntryMap
    = foldr update wordEntryMap (zip [lineNumber, lineNumber - 1 .. ] xs)
      where
        update (num,x) wordMap = parseLineToWordEntryMap num x wordMap

したがってparseLineToWordEntryMap、引数が厳密である場合Map(引数としてはかなり一般的Map)、リストの最後に到達するまでは何もできず、結果はリストの最初に戻って作成されます。

可能であれば、入力を逆に、左に折りたたんで消費し、折りたたまれた関数が右の厳密さを持っていることを確認して、大きなサンクが作成されないようにする必要があります。

より具体的な提案については、コードをもっと見る必要があります。

于 2012-07-09T13:48:39.247 に答える