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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:05:26