我编写了这些代码行,以便对5个数字的输入进行排序。
但是当我编译并运行它时,会出现类似 - “int_of_string”
的错误我不知道为什么这不会运行。我是Ocaml的新手。
let sort2 (a, b) = if a<b
then (a, b)
else (b, a)
let sort3 (a, b, c) =
let (a, b) = sort2(a, b) in
let (b, c) = sort2(b, c) in
let (a, b) = sort2(a, b) in
(a, b, c)
let sort5 (a, b, c, d, e) =
let (a, b, c) = sort3 (a, b, c) in
let (c, d, e) = sort3(c, d, e) in
let (a, b, c) = sort3 (a, b, c) in
(a, b, c, d, e)
let _ =
let a = read_int () in
let b = read_int () in
let c = read_int () in
let d = read_int () in
let e = read_int () in
let (a, b, c, d, e) = sort5 (a, b, c, d, e) in
print_int a; print_newline ();
print_int b; print_newline ();
print_int c; print_newline ();
print_int d; print_newline ();
print_int e; print_newline ()
答案 0 :(得分:2)
Exception: Failure "int_of_string".
当您键入一行无法解析为整数的输入行(例如空行)时,会发生异常。这必须是你测试期间发生的事情。
如果你想要一点健壮性,你必须考虑输入可能是错误的。您可以捕获运行时错误以处理意外输入:
# let maybe_read_int () = try Some (read_int ()) with Failure _ -> None;;
val maybe_read_int : unit -> int option = <fun>
上述函数返回的值为int option
。
# maybe_read_int ();;
foo
- : int option = None
成功
# maybe_read_int ();;
42
- : int option = Some 42
你不能像在你的例子中那样使用上面的函数,因为你的一些变量会绑定到None
(在这种情况下,这不会让异常冒泡)。相反,您可能需要读取尽可能多的行,直到获得5个整数:
let rec read_n_ints n =
if (n > 0) then
match (maybe_read_int ()) with
| None -> read_n_ints n
| Some v -> v :: (read_n_ints (n - 1))
else [];;
# read_n_ints 3;;
0
foo
bar
1
2
- : int list = [0; 1; 2]
现在您有了一个整数列表,您可以使用模式匹配将它们绑定到变量。请注意,我们必须详尽无遗,并考虑不应发生的情况:
# match (read_n_ints 5) with
| [ a; b; c; d; e] -> (a + b + c + d + e)
| _ -> raise (Failure "Failed to read 5 integers");;
3
foo
2
10
30
ii
r
90
3
- : int = 136