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

为什么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]这一个参数,和函数要求的元组参数类型不匹配,所以触发类型不匹配报错。

正确使用方案

二选一即可:

  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:03