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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:43:16