StandardML中实现数值对乘法函数遇Real分支报错求助
问题分析与修复方案
核心问题
- 返回类型不匹配:SML是强类型语言,函数必须返回单一类型。你代码里Int分支返回
int,Real分支返回real,类型冲突导致编译错误。 - 冗余转换:
Int.toInt i1完全多余——Int i1构造器里的i1本身就是int类型,直接相乘即可。
修复方案
方案1:统一返回Real类型
把整数乘积转为Real,让两个分支返回类型一致:
datatype numberType = Int of int | Real of real fun f1(pair: numberType * numberType) = let val p1 = #1 pair val p2 = #2 pair in case (p1, p2) of (Int i1, Int i2) => Real.fromInt (i1 * i2) | (Real r1, Real r2) => r1 * r2 | _ => raise Fail "数对成员必须同为Int或Real类型" end;
方案2:用自定义类型包裹结果
保留结果的类型区分,返回numberType类型:
datatype numberType = Int of int | Real of real fun f1(pair: numberType * numberType) = let val p1 = #1 pair val p2 = #2 pair in case (p1, p2) of (Int i1, Int i2) => Int (i1 * i2) | (Real r1, Real r2) => Real (r1 * r2) | _ => raise Fail "数对成员必须同为Int或Real类型" end;
注意事项
- 必须先定义
numberType这个自定义数据类型,否则代码会提示类型未定义。 - 原代码的默认分支提示信息不准确,修改后明确指出错误原因是数对成员类型不统一。
内容的提问来源于stack exchange,提问作者Hank Lenzi
相关产品推荐
相关产品推荐

