Ocaml - 字符串到 (int*int*int) 列表

Posted

技术标签:

【中文标题】Ocaml - 字符串到 (int*int*int) 列表【英文标题】:Ocaml - string to (int*int*int) list 【发布时间】:2011-09-17 08:30:36 【问题描述】:

在 ocaml 函数中,它可以将这样的字符串 "[(1,2,3);(1,2,5);(2,3,4)]" 解析为 (int*int*int) 列表?还是我必须编写自己的解析函数?

谢谢

格雷格

【问题讨论】:

【参考方案1】:

好吧,借助标准库中的 Scanf 模块,这应该不会太难——您将能够轻松地扫描三元组,然后只需要添加一些逻辑来解析列表。

你也可以看看deriving:

对 OCaml 的扩展,用于从类型声明派生函数。包括用于漂亮打印、具有结构共享、动态类型、相等性等的类型安全编组的派生程序。

【讨论】:

谢谢,我是这样做的,不是很漂亮,但很有效;) let rec parse_string s = match s with | _ 当 String.length s > 7 -> (Scanf.sscanf (String.sub s 1 7) "(%i,%i,%i)" (fun abc -> (a,b,c))):: (parse_string (String.sub s 8 ((String.length s)-8))) |_ -> [];;【参考方案2】:

如果您愿意使用稍微不同的格式,您可以免费获得解析器。使用 sexplib 语法扩展,您可以简单地编写:

type t = (int * int * int) list with sexp

这将自动为您定义两个函数,sexp_of_tt_of_sexp。 Sexplib 还提供了多种解析功能。

然而,s 表达式的具体语法是不同的。您的示例将被渲染:

((1 2 3) (1 2 5) (2 3 4))

【讨论】:

以上是关于Ocaml - 字符串到 (int*int*int) 列表的主要内容,如果未能解决你的问题,请参考以下文章

OCaml:将 bool 转换为 int

Ocaml 类型中的 Int 的 Int

OCaml 表达式类型问题

在 OCaml 中访问 (int * float) 列表中的浮点数

Sys.mkdir ocaml 中的 int 参数是啥

整数列表到整数 OCaml