utop中的模式匹配更严格?

时间:2014-09-29 15:31:26

标签: ocaml utop

例如,有一个函数可以测试列表是否单调递增,源代码和测试用例是:

open Printf

let rec mon_inc (numbers : int list) : bool =
    match numbers with
    | [] -> true
    | _ :: [] -> true
    | hdn :: tln -> (hdn <= (List.hd tln)) && mon_inc(tln)

let a = [1;2;5;5;8]
let b = [1;2;5;4;8]
let c = [8]
let d = []
let e = [7;8]

let () =
    printf "The answer of [1;2;5;5;8]: %B\n" (mon_inc a)

let () =
    printf "The answer of [1;2;5;4;8]: %B\n" (mon_inc b)

let () =
    printf "The answer of [8]: %B\n" (mon_inc c)

let () =
    printf "The answer of []: %B\n" (mon_inc d)

let () =
    printf "The answer of [7;8]: %B\n" (mon_inc e)

编译并运行代码:

$ corebuild inc.native
$ ./inc.native 
The answer of [1;2;5;5;8]: true
The answer of [1;2;5;4;8]: false
The answer of [8]: true
The answer of []: true
The answer of [7;8]: true

但是,当我想在utop中使用此功能时,它会显示:

utop # #use "inc.ml";;
File "inc.ml", line 7, characters 29-40:
Error: This expression has type int option
but an expression was expected of type int 

2 个答案:

答案 0 :(得分:3)

这是因为你已经在顶层打开了Core.Std模块。

Core.Std是OCaml标准库的覆盖,具有不同的接口。例如,在标准库函数中,List.hd返回类型&#39; a的值,如果list为空则引发异常。在Janestreet的版本函数中,List.hd有一个不同的类型 - 它返回一个选项,如果列表为空则评估为None,如果不是,则评估为Some值。考虑添加

open Core.Std

到inc.ml的顶部。

答案 1 :(得分:3)

这可能是由于你的顶级开放Core,它提供了一个返回选项的List.hd。在这种特殊情况下,您可以通过更改匹配方式来完全删除List.hd来解决问题:

let rec mon_inc = function
  | []
  | _::[] -> true
  | x::y::rest -> x <= y && mon_inc rest