随机数生成器和模式匹配 - OCaml

时间:2016-11-01 17:10:27

标签: ocaml

为了了解模式匹配,我目前正在尝试在Ocaml中生成1到3的数字并将其写入stdout。

这是我到目前为止所写的内容(带有空参数的函数):

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 个答案:

答案 0 :(得分: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 ...