casting - Ocaml 将字符串转换为元组列表
问题描述
我有带有文本的文件“example.dat” "[(1,2); (3,4); (5,6)]"
。我需要从中获取元组列表。我知道,如何从整数列表中获取它。
# let f line = List.map int_of_string line;;
# open Printf
let file = "example.dat"
let () =
let ic = open_in file in
try
let line = input_line ic in
f line;
flush stdout;
close_in ic
with e ->
close_in_noerr ic;
raise e;;
我必须如何改变我的功能?
解决方案
给定一个表示整数的字符串列表,您的函数f
将返回一个整数列表。它不返回元组列表。
您没有说是否要验证输入是否具有某种正确的形式。如果您想验证它是否具有(比如说)(int * int) list
OCaml 中的类型列表的形式,这是一个需要一些工作的解析问题。
如果您只想提取输入行中看起来像 int 的部分,则可以使用Str
模块中的正则表达式处理:
# let re = Str.regexp "[^0-9]+" in
Str.split re "[(1,2); (37,4); (5,6)]";;
- : string list = ["1"; "2"; "37"; "4"; "5"; "6"]
然后您可以重写您的函数f
以将每对整数收集到一个元组中。我没有看到一个很好的方法来使用List.map
它。您可能必须编写自己的递归函数或使用List.fold_left
.
更新
我将为您编写一个函数,将值列表更改为对列表。我希望这不是学校作业,在这种情况下,您应该自己解决这个问题。
let rec mkpairs l =
match l with
| [] | [_] -> []
| a :: b :: rest -> (a, b) :: mkpairs rest
如您所见,如果列表具有奇数个元素,此函数会静默丢弃列表的最后一个元素。
这个函数不是尾递归的。所以这是你可以考虑改进的事情。
推荐阅读
- flutter - 从 DropdownButton 在正确的类别上显示文本字段
- javascript - 如何在不覆盖以前数据的情况下在 DynamoDB 表的 Item 属性中添加新数据?
- dc.js - dc.js 动态瀑布图
- excel - Power Query - M 语言:多列的总和与分组依据
- docker - Dockerized NGINX:在上游“odoo:8069”中找不到主机
- python - 将层次索引转换为 Pandas 中的列
- reactjs - 如何使用 axios 从响应中获取数据
- python - 有没有办法只在 imdbpy 中获取评论评论的内容
- drake - pydrake URDF 设置动态参数
- java - 如何从远程 maven 存储库更新 pom.xml SNAPSHOT 依赖版本而不手动触摸它?