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_t
和 t_of_sexp
。 Sexplib 还提供了多种解析功能。
然而,s 表达式的具体语法是不同的。您的示例将被渲染:
((1 2 3) (1 2 5) (2 3 4))
【讨论】:
以上是关于Ocaml - 字符串到 (int*int*int) 列表的主要内容,如果未能解决你的问题,请参考以下文章