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

OCaml实现逆波兰表示法求值添加异常处理时编译报错求助

问题排查与修复

错误原因

你的错误属于语法结构误判:你编写的aux函数用function关键字做模式匹配,第一个匹配分支是空列表[]的逻辑,该分支内的try ... with代码块没有正确闭合,导致后续本应和[]平级的Nombre a :: q、Op_unaire f :: q等模式匹配分支,被OCaml编译器识别为with后的异常匹配分支。异常匹配的分支要求模式类型必须是exn,而你写的列表模式自然会触发类型不匹配的报错。

修复后的完整代码

只要把空列表分支的try ... with逻辑用括号闭合,让后续分支回归function的模式匹配层级即可:

open Stack

type lexeme = 
  | Nombre of float
  | Op_binaire of (float -> float -> float)
  | Op_unaire of (float -> float)

exception Syntax_Error

let evalue lst = 
  let pile = create () in 
  let rec aux = function
  | [] -> 
      let rep = pop pile in
      (* 校验栈中是否仅剩余一个结果元素 *)
      (try 
        pop pile; 
        raise Syntax_Error 
      with Empty -> rep)
  | Nombre a :: q -> push a pile; aux q
  | Op_unaire f :: q -> 
      let a = pop pile in 
      push (f a) pile; 
      aux q
  | Op_binaire f :: q -> 
      let a = pop pile in 
      let b = pop pile in 
      (* 注意栈弹出顺序:先弹出的是右操作数,后弹出的是左操作数,需调整参数顺序避免运算结果错误 *)
      push (f b a) pile; 
      aux q
  in 
  try 
    aux lst 
  with 
  | Empty -> raise Syntax_Error

额外说明

你提到的Caml Light可以运行,是因为早期Caml Light的语法缩进规则更宽松,对代码块边界的识别和现代OCaml存在差异,并不是功能特性不兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:09:00