0

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

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 
4

2 回答 2

3

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

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

open Core.Std

到inc.ml的顶部。

于 2014-09-29T15:40:20.570 回答
3

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

let rec mon_inc = function
  | []
  | _::[] -> true
  | x::y::rest -> x <= y && mon_inc rest
于 2014-09-29T15:40:44.597 回答