为了了解模式匹配,我目前正在尝试在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)。
答案 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 ...