SML中传递NONE或SOME作为函数参数出现类型不匹配如何解决?
问题根源
该类型不匹配错误与f参数是否为可选参数无关,核心原因是SML要求同一个函数的所有分支返回值类型必须完全一致:
- 代码后三个分支返回值为
NONE,属于**'a option类型** - 第一个分支直接返回
f x y,传入的add函数返回值为int类型,不属于option类型,因此类型推断失败
删除其他分支后,函数仅存在返回f x y的分支,返回值类型与add的int类型匹配,因此可以正常运行。
修复方案
最合理的修改是调整第一个分支的返回值,将f x y的执行结果用SOME包裹,保证所有分支都返回option类型:
fun fx (SOME x) (SOME y) f = SOME (f x y) | fx (SOME x) (NONE) f = NONE | fx (NONE) (SOME y) f = NONE | fx (NONE) (NONE) f = NONE; fun add x y = x + y; fx (SOME 2) (SOME 4) add;
修改后执行上述代码会得到结果SOME 6,符合「仅两个输入都不为NONE时才执行运算」的预期逻辑。
内容的提问来源于stack exchange,提问作者akhil
相关产品推荐
相关产品推荐

