2016-11-01 4 views
0

Чтобы узнать о совпадении с образцом, я в настоящее время пытаюсь сгенерировать число от 1 до 3 в Ocaml и записать его в stdout.Генератор случайных чисел и сопоставление образцов - OCaml

Это то, что я написал до сих пор (функция с пустым аргументом):

let random_compchoice() = match Random.int 3 with 
    | 1 -> "1" 
    | 2 -> "2" 
    | 3 -> "3" 
    | _ -> "Error" 
;; 

Printf.printf "The option is %s\n" random_compchoice;; 

Однако это вызывает:

**Error**: This expression has type unit -> string 
     but an expression was expected of type string 

Но, если я делаю это:

let random_compchoice = match Random.int 3 with 
    | 1 -> "1" 
    | 2 -> "2" 
    | 3 -> "3" 
    | _ -> "Error" 
;; 

Printf.printf "The option is %s\n" random_compchoice;; 

Он компилируется, но всегда по умолчанию:

The option is Error 

Любые идеи о том, чего я там не вижу? Заранее спасибо. (Также не уверен, что можно начинать с 1 как первый «случай», а не 0).

+1

Чтобы ответить на ваш последний вопрос, у вас могут быть любые шаблоны, которые вы хотите. Они на самом деле не «начинают» нигде. OCaml будет предупреждать, если шаблоны не охватывают все возможные случаи. С другой стороны, «Random.int 3» возвращает 0, 1 или 2. –

+0

... и нам понадобится тип уточнения, чтобы сделать матч исчерпывающим, поэтому вам всегда понадобится этот ловушка до тех пор. – nlucaroni

ответ

4

В первом примере, вам нужно на самом деле вызвать функцию с аргументом unit,

Printf.printf "The option is %s\n" @@ random_compchoice();; 

Относительно того, почему второй образец всегда терпит неудачу, есть две причины. Почему всегда терпит неудачу, потому что вы не инициализируется генератор случайных чисел (по крайней мере),

Random.self_init() 

Если вы не сделаете это, вы получите тот же поток случайных чисел на каждом выполнении в этом случае 0. Кроме того, the random number generator of integers is from 0 (inclusive) ... n (exclusive). Вы можете просто добавить его к сгенерированному случайному числу,

... = match 1 + Random.int 3 with ...