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

SML代码中“Error inserting INFIX”错误的原因及解决咨询

SML语法错误排查:Inserting INFIX错误解决方法

我刚接触SML语言,目前仍处于学习入门阶段。以下是我的最小可复现示例(MRE)代码:

Exception Failure

fun max(a,b) =
        if a-b > 0 then
                a
        else
                b

fun knapsack(0,xs) = 0
  | knapsack(a,[]) = raise Failure
  | knapsack(a,(x,y)::xs) =
                if y > a then
                        knapsack(a,xs)
                else
                        max(knapsack(a,xs),x+knapsack(a-y,xs))

fun main() =
        let
                (*(value,weight)*)
                val l = [(20, 9), (17, 8), (14, 7), (10, 6), (8, 5), (6, 3)]
                val c = 20
        in
                knapsack(c,l)
        end

编译时出现如下错误:

knapsack.sml:1.2 Error: syntax error: inserting  INFIX
/usr/lib/smlnj/bin/sml: Fatal error -- Uncaught exception Compile with "syntax error" raised at ../compiler/Parse/main/smlfile.sml:15.24-15.46

我猜测错误可能由::运算符导致,但无法确定具体问题,希望了解该错误的含义及解决方法。


错误原因分析

错误提示里的syntax error: inserting INFIX是编译器尝试修复语法错误时的提示,实际问题不是::运算符,而是代码第一行的语法错误:SML中声明异常的关键字是小写的exception,你写成了大写的Exception。SML的关键字均为小写,大写开头的标识符会被当作普通变量/构造器,编译器无法识别大写的Exception,因此在解析第一行时直接触发语法错误。

解决方法

把代码第一行的Exception Failure修改为正确的异常声明:

exception Failure

修改后的完整代码如下:

exception Failure

fun max(a,b) =
        if a-b > 0 then
                a
        else
                b

fun knapsack(0,xs) = 0
  | knapsack(a,[]) = raise Failure
  | knapsack(a,(x,y)::xs) =
                if y > a then
                        knapsack(a,xs)
                else
                        max(knapsack(a,xs),x+knapsack(a-y,xs))

fun main() =
        let
                (*(value,weight)*)
                val l = [(20, 9), (17, 8), (14, 7), (10, 6), (8, 5), (6, 3)]
                val c = 20
        in
                knapsack(c,l)
        end

补充说明:SML标准库已内置Failure异常,你也可以直接删除第一行的异常声明代码,直接使用raise Failure即可正常编译运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:42:50