SML编写all_answers_helper出现types of rules don't agree等错误求解
问题原因分析
两个报错的核心根源是SML的运算符优先级逻辑导致的类型不匹配:
- SML中函数调用的优先级远高于列表拼接运算符
@,你代码里的all_answers_helper f xs' v @ acc会被编译器自动解析为(all_answers_helper f xs' v) @ acc all_answers_helper的返回值是'a list option类型,option类型无法直接和列表执行@拼接操作,就触发了类型匹配错误:第一条报错提示case分支的返回值类型不一致(一个是option、一个被推导为list),第二条报错提示函数的实际返回类型和推导的声明类型不符。
修正代码
你只需要将拼接后的列表作为累加器参数传入递归调用,给拼接逻辑加括号调整执行顺序即可:
fun all_answers_helper f xs acc = case xs of [] => SOME acc | x::xs' => case f x of NONE => NONE | SOME v => all_answers_helper f xs' (v @ acc)
可选优化:如果希望最终返回的列表元素顺序和原列表处理顺序一致,可以在返回
SOME acc前对acc执行翻转,或者调整拼接顺序为acc @ v(列表较长时前者效率更高)。
内容的提问来源于stack exchange,提问作者Terry Chung
相关产品推荐
相关产品推荐

