【问题标题】:Getting a random number in a function in OCAML OR Telling compiler to evaluate function each time在 OCAML 中的函数中获取随机数或告诉编译器每次都评估函数
【发布时间】:2019-04-26 03:46:12
【问题描述】:

我是 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

【问题讨论】:

    标签: random functional-programming ocaml random-seed


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢杰弗里。对于未来的读者(或我未来的自己),请记住您的签名将是“val f : unit -> int” 还要确保在使用此方法时,调用 f() 而不仅仅是 f。
    • 在像 OCaml 这样的 FP 语言中,函数是相当普通的一等值。如果您只是给出您正在谈论的值的函数的名称 - 函数本身。所以它不代表函数调用。不久之后,这变得很自然,您甚至都不会去想它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多