SMLNJ打开Real签名后函数类型不匹配错误求助
解决SML/NJ中打开Real后sum函数的类型冲突问题
问题原因
打开Real结构后,SML的重载运算符+会默认绑定到Real.+(实数加法)。原函数的类型矛盾点在于:
- 第一个分支的
acc是int类型,最终通过Real.fromInt转为real返回 - 第二个分支中
acc + 1被解释为实数加法,编译器会推断acc必须是real类型,这就导致两个分支的acc类型不统一,触发类型匹配错误。
解决方案
以下两种方法均可在全局打开Real的前提下解决问题:
方案1:全程使用实数累加器
修改函数,让累加器acc从一开始就保持real类型,将整数1转为实数后再执行加法:
open Real fun sum _ nil acc = acc | sum x (hd::tl) acc = if x=hd orelse toUpper x=hd then sum x tl (acc + fromInt 1) else sum x tl acc
调用示例:
sum #"a" [#"a", #"A", #"b"] 0.0;
方案2:显式指定整数加法
保留累加器acc的int类型,使用Int.+明确调用整数加法,避免被Real.+覆盖:
open Real fun sum _ nil acc = fromInt acc | sum x (hd::tl) acc = if x=hd orelse toUpper x=hd then sum x tl (Int.+ (acc, 1)) else sum x tl acc
调用示例:
sum #"a" [#"a", #"A", #"b"] 0;
补充说明
即使在第一个分支显式写Real.fromInt acc也无法解决问题,因为核心矛盾是第二个分支中acc + 1的类型推断导致acc被判定为real,和第一个分支的int类型acc冲突。必须统一两个分支的acc类型,或者明确指定加法运算符的类型。
内容的提问来源于stack exchange,提问作者lil_papa
相关产品推荐
相关产品推荐

