如何让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
相关产品推荐
相关产品推荐

