SML中如何类型转换?S-Expression解析结果转指定数据结构
问题解决与SML/NJ S-Expression库使用说明
类型转换函数修正
要将SExp.value list转换为string list list list,需针对三层嵌套结构分层递归处理,以下是正确实现:
(* 转换最内层:单个STRING类型值转成string列表 *) fun convertString (SExp.STRING s) = [s] | convertString _ = raise Fail "最内层需为STRING类型" (* 转换中间层:LIST包裹的STRING集合转成string列表的列表 *) fun convertStringList (SExp.LIST vs) = map convertString vs | convertStringList _ = raise Fail "中间层需为LIST类型" (* 转换最外层:多个中间层LIST集合转成目标类型string list list list *) fun convertTopLevel [] = [] | convertTopLevel (v::vs) = convertStringList v :: convertTopLevel vs (* 对接解析结果与图构造函数 *) fun parseToGraph parsedValues = ArrayGraph.makeGraph (convertTopLevel parsedValues)
错误原因说明
你之前的代码存在以下问题:
- 第一个函数仅匹配单个特定结构的
SExp.value,但解析结果是SExp.value list,类型不匹配; - 第二个函数错误标注返回类型为
SExp.value,但makeGraph返回的是图类型,类型冲突; - 第三个函数递归逻辑未对齐三层嵌套结构,无法生成目标类型。
SML/NJ S-Expression库中文说明
库概述
SExp库提供S表达式的解析、构造与操作工具,核心类型SExp.value定义如下:
datatype value = SYMBOL of Atom.atom | BOOL of bool | INT of IntInf.int | FLOAT of real | STRING of string | QUOTE of value | LIST of value list
核心功能
- 解析:
SExpParser.parse将文本输入解析为SExp.value list,每个顶层S表达式对应列表中的一个元素; - 构造:可直接通过类型实例创建S表达式,例如
LIST [STRING "node1", SYMBOL (Atom.atom "node2")]; - 遍历操作:通过模式匹配遍历S表达式结构,提取元素或完成类型转换。
使用注意事项
- 解析时,输入中的符号会转为
SYMBOL类型,字符串转为STRING类型,数字转为INT或FLOAT类型; - S表达式中的
'x语法会被解析为QUOTE x类型。
内容的提问来源于stack exchange,提问作者Vlad Zhdanov
相关产品推荐
相关产品推荐

