Ocaml排序程序

时间:2016-10-14 19:19:29

标签: sorting ocaml

我编写了这些代码行,以便对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 ()

1 个答案:

答案 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