在OCAML中的函数中获取随机数,或告诉编译器每次评估函数

时间:2019-04-25 19:35:23

标签: random functional-programming ocaml random-seed

我是OCAML的新手,正在玩在随机5X5正方形上放置标记。我在下面编写了示例程序。 “ silly_method1”有效,但是请注意它带有一个参数。我真的没有理由传递我想要的东西。我只是想问一个随机数,以便在特定的正方形上创建机器人:

let create = {x = ( Random.int 4); y=3; face = North}

但是,我每次都到达相同的位置。这对我来说很有意义。我假设设置方式“创建”基本上是一个常数。它被评估一次,仅此而已!我已经在下面的silly_method2中修复了它,但是看起来很丑!

let silly_method2 _ = (Random.int 10)

每次我都必须调用它时,即使我没有真正使用它,也必须传递一个参数。

正确的方法是什么?必须有某种方法可以使函数不带任何参数并传回一个随机数(或随机元组等)。 可能与此相关...是否有一种方法可以告诉OCaml不要一次评估函数并保存结果,而是每次都重新计算答案?

感谢您对我的耐心!

戴夫

let _ = Random.self_init()

let silly_method1 x = x + (Random.int 10)
let silly_method2 _ = (Random.int 10)
let report1 x = (print_newline(); print_string("report1 begin:  "); print_int (silly_method1 x); print_string("report1 end"); print_newline(); )
let report2 y = (print_newline(); print_string("report2 begin:  "); print_int(silly_method2 y ); print_string("report2 end"); print_newline(); )

let _ = report1 3
let _ = report1 3
let _ = report1 3

let _ = report2 3
let _ = report2 3
let _ = report2 3

1 个答案:

答案 0 :(得分:0)

在OCaml中定义不带参数的函数的惯用方式是使参数为(),这是unit类型的值(唯一的值):

# let f () = Random.int 10;;
val f : unit -> int = <fun>
# f ();;
- : int = 5
# f ();;
- : int = 2

OCaml不会保存函数结果供以后重用。如果您想要这种行为,则必须使用lazy明确要求它。