如何将字符串转换为ocaml中的整数列表?
How to convert a string to integer list in ocaml?
我需要在 ocaml 中传递两个列表作为命令行参数。
我在程序中使用了下面的代码来访问它。
let list1=Sys.argv.(1);;
let list2=Sys.argv.(2);;
我需要将 list1 和 list2 作为整数列表。
我收到错误
This expression has type string but an expression was expected of type
int list
正在处理。
如何将该参数转换为整数列表。
参数以这种格式传递 [1;2;3;4] [1;5;6;7]
Sys.argv.(n)
永远是一个字符串。您需要将字符串解析为整数列表。你可以尝试这样的事情:
$ ocaml
OCaml version 4.01.0
# #load "str.cma";;
# List.map int_of_string (Str.split (Str.regexp "[^0-9]+") "[1;5;6;7]");;
- : int list = [1; 5; 6; 7]
当然这不会检查输入的格式是否正确。它只是通过蛮力拉出数字序列。为了做得更好,您需要进行一些真正的词法分析和简单的解析。
(也许这是显而易见的,但您也可以在顶层(OCaml 读取-评估-打印循环)中测试您的函数。顶层将处理根据您输入的内容制作列表的工作。)
由于Sys.argv是一个string array
,您需要编写自己的转录函数。
我想最简单的方法是使用标准库提供的 Genlex 模块。
let lexer = Genlex.make_lexer ["["; ";"; "]"; ]
let list_of_string s =
let open Genlex in
let open Stream in
let stream = lexer (of_string s) in
let fail () = failwith "Malformed string" in
let rec aux acc =
match next stream with
| Int i ->
( match next stream with
| Kwd ";" -> aux (i::acc)
| Kwd "]" -> i::acc
| _ -> fail () )
| Kwd "]" -> acc
| _ -> fail ()
in
try
match next stream with
| Kwd "[" -> List.rev (aux [])
| _ -> fail ()
with Stream.Failure -> fail ()
let list1 = list_of_string Sys.argv.(1)
let list2 = list_of_string Sys.argv.(2)
根据您要使用的 OCaml 风格,其他一些库可能看起来更有趣。如果你喜欢yacc,Menhir可能会在几行代码中解决你的问题。
我需要在 ocaml 中传递两个列表作为命令行参数。 我在程序中使用了下面的代码来访问它。
let list1=Sys.argv.(1);;
let list2=Sys.argv.(2);;
我需要将 list1 和 list2 作为整数列表。 我收到错误
This expression has type string but an expression was expected of type int list
正在处理。 如何将该参数转换为整数列表。 参数以这种格式传递 [1;2;3;4] [1;5;6;7]
Sys.argv.(n)
永远是一个字符串。您需要将字符串解析为整数列表。你可以尝试这样的事情:
$ ocaml
OCaml version 4.01.0
# #load "str.cma";;
# List.map int_of_string (Str.split (Str.regexp "[^0-9]+") "[1;5;6;7]");;
- : int list = [1; 5; 6; 7]
当然这不会检查输入的格式是否正确。它只是通过蛮力拉出数字序列。为了做得更好,您需要进行一些真正的词法分析和简单的解析。
(也许这是显而易见的,但您也可以在顶层(OCaml 读取-评估-打印循环)中测试您的函数。顶层将处理根据您输入的内容制作列表的工作。)
由于Sys.argv是一个string array
,您需要编写自己的转录函数。
我想最简单的方法是使用标准库提供的 Genlex 模块。
let lexer = Genlex.make_lexer ["["; ";"; "]"; ]
let list_of_string s =
let open Genlex in
let open Stream in
let stream = lexer (of_string s) in
let fail () = failwith "Malformed string" in
let rec aux acc =
match next stream with
| Int i ->
( match next stream with
| Kwd ";" -> aux (i::acc)
| Kwd "]" -> i::acc
| _ -> fail () )
| Kwd "]" -> acc
| _ -> fail ()
in
try
match next stream with
| Kwd "[" -> List.rev (aux [])
| _ -> fail ()
with Stream.Failure -> fail ()
let list1 = list_of_string Sys.argv.(1)
let list2 = list_of_string Sys.argv.(2)
根据您要使用的 OCaml 风格,其他一些库可能看起来更有趣。如果你喜欢yacc,Menhir可能会在几行代码中解决你的问题。