You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elm Parser.loop实现rawData时无限循环问题求助

Elm Parser递归loop无限循环问题排查与解决

问题成因分析

你的rawData陷入无限循环的核心原因是**dataChunk在无剩余输入时仍能成功解析出空的命令列表和内容列表**,导致loopHelper永远触发Loop分支,无法终止循环:

  • commands基于loopHelper command实现,允许解析0个或多个命令(无命令时command解析失败,loopHelper返回Done [])
  • contents同理,允许解析0个或多个内容
  • 当输入完全解析完毕后,dataChunk仍能生成( [], [] )的有效结果,此时loopHelper dataChunk会判定解析成功,持续执行Loop,直至栈溢出
  • 其他函数(如files/directories)无此问题,是因为无对应内容时,单个file/directory解析器会直接失败,触发loopHelper的Done分支终止循环

解决方案

要修复问题,需确保dataChunk必须包含至少一个命令,即让commands强制解析出至少一个命令,而非允许空列表。

修改方案1:重构commands解析器

将原来允许空列表的commands改为强制至少一个命令:

commands : Parser (List TermCmd)
commands =
    command
        |> andThen (\firstCmd ->
            loop [firstCmd] <| \reversedCmds ->
                oneOf
                    [ succeed (\cmd -> Loop (cmd :: reversedCmds))
                        |= command
                    , succeed ()
                        |> map (\_ -> Done (List.reverse reversedCmds))
                    ]
        )

修改方案2:直接约束dataChunk

在dataChunk中直接限制命令列表非空:

dataChunk : Parser ( List TermCmd, List Content )
dataChunk =
    succeed (\cmds ctnt -> ( cmds, ctnt ))
        -- 强制至少解析一个命令
        |= (command |> andThen (\first -> loop [first] (\rev -> loopHelper command rev)))
        |= contents

修改后,当无剩余命令时dataChunk会解析失败,loopHelper会触发Done分支,rawData的循环将正常终止,且能正确解析你的示例输入,得到与手动调用4次dataChunk一致的结果。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:30:22