例如,有一个函数可以测试列表是否单调递增,源代码和测试用例是:
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
答案 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