首页 > 解决方案 > 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;;

我必须如何改变我的功能?

标签: castingtuplesocaml

解决方案


给定一个表示整数的字符串列表,您的函数f将返回一个整数列表。它不返回元组列表。

您没有说是否要验证输入是否具有某种正确的形式。如果您想验证它是否具有(比如说)(int * int) listOCaml 中的类型列表的形式,这是一个需要一些工作的解析问题。

如果您只想提取输入行中看起来像 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

如您所见,如果列表具有奇数个元素,此函数会静默丢弃列表的最后一个元素。

这个函数不是尾递归的。所以这是你可以考虑改进的事情。


推荐阅读