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
相关产品推荐
相关产品推荐

