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

如何让SML/NJ将常规列表表示转换为Cons形式输出?

在SML/NJ中输出列表的Cons形式表示

单层列表的实现

直接写一个递归函数,遍历列表元素并拼接成::连接的字符串:

fun listToCons [] = "[]"
  | listToCons (x::xs) = 
      Int.toString x ^ "::" ^ listToCons xs;

测试示例:

listToCons [1,2,3];  (* 输出结果:"1::2::3::[]" *)

嵌套列表(int list list)的实现

要处理多层嵌套的列表,需要递归解析每个子列表,这里写一个支持嵌套的版本:

fun listToCons' (lst : 'a list) : string =
    case lst of
        [] => "[]"
      | x::xs =>
          let
              val elemStr = 
                  case x of
                      _::_ => listToCons' x  (* 元素是列表则递归处理 *)
                    | _ => if typeOf x = typeOf (0 : int) then Int.toString x
                           else (* 可扩展支持字符串、布尔等类型 *) "<unknown>"
          in
              elemStr ^ "::" ^ listToCons' xs
          end;

测试嵌套示例:

listToCons' [[1,2], [3], []];  (* 输出结果:"(1::2::[])::(3::[])::[]::[]" *)

理解列表的内部存储逻辑

SML的列表本质是单向链表:

  • 空列表[]是一个独立的构造值;
  • 非空列表x::xs是一个二元结构:第一个部分是表头元素x,第二个部分是表尾xs(另一个完整的列表)。

比如[1,2,3]的存储结构是:1关联到2::3::[],2关联到3::[],3关联到[];
而嵌套列表[[1,2], [3], []]的结构是:第一个元素1::2::[]关联到第二个元素3::[],后者再关联到空列表[],整个大列表的末尾是[]。

内容的提问来源于stack exchange,提问作者AKapoor30

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:50:14