为什么Standard ML中定义的列表追加函数运行报错而OCaml中可正常运行?
报错原因解答
你遇到的是OCaml和SML在函数参数传递默认写法上的差异问题:
- OCaml中你定义的
let a b c = b@[c]是柯里化函数,类型为'a list -> 'a -> 'a list,支持多个参数分开传入,所以a [1] 2是合法调用:先传入第一个参数[1]得到单参数函数,再传入第二个参数2得到最终结果。 - SML/NJ中你写的
fun a(b,c) = b@[c]是接收元组作为唯一参数的单参数函数,类型为'a list * 'a -> 'a list,要求传入的是一个包含两个元素的元组,不支持分开传两个独立参数。你调用时写的a [1] 2相当于只给函数传了[1]这一个参数,和函数要求的元组参数类型不匹配,所以触发类型不匹配报错。
正确使用方案
二选一即可:
- 保持现有函数定义不变,调用时传入元组参数,符合你查阅的书籍示例写法:
a ([1], 2);
运行后返回结果为val it = [1,2] : int list,符合预期。
2. 如果要和OCaml写法对齐,支持柯里化调用,修改函数定义为柯里化版本:
fun a b c = b @ [c];
修改后函数类型为fn : 'a list -> 'a -> 'a list,就可以直接用a [1] 2的方式调用。
内容的提问来源于stack exchange,提问作者wang kai
相关产品推荐
相关产品推荐

