2014-09-29 4 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'유형의 값을 반환하고 list가 비어 있으면 예외를 발생시킵니다. Janestreet의 버전 함수에서 List.hd는 다른 유형을 가지고 있습니다. '옵션을 반환하고 목록이 비어 있으면 None으로 평가하고 그렇지 않으면 Some 값으로 평가합니다. 추가 고려하십시오. inc.ml의 맨 위에

open Core.Std 

관련 문제