2014-09-29 3 views
0

Например, есть функция, тестирование, если список монотонно возрастает, исходный код и тестирование случаев является:Сравнение шаблонов в 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 

ответ

3

Возможно, это связано с тем, что вы открыли верхний уровень Core, который предоставляет List.hd, который возвращает параметр. В этом конкретном случае вы можете решить проблему, изменив способ, которым вы полностью удаляете List.hd:

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

Это потому, что вы открыли модуль Core.Std в верхнем уровне.

Core.Std - это наложение поверх стандартной библиотеки OCaml с другим интерфейсом. Например, в стандартной библиотечной функции List.hd возвращает значение типа 'a и вызывает исключение, если список пуст. В функции версии Janestreet List.hd имеет другой тип - он возвращает 'параметр, он вычисляет значение None, если список пуст, и некоторому значению, если это не так. Рассмотрим добавление

open Core.Std 

наверху inc.ml.

Смежные вопросы