Получение случайного числа в функции в OCAML ИЛИ Указание компилятору каждый раз оценивать функцию - PullRequest
0 голосов
/ 25 апреля 2019

Я новичок в 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 голосов
/ 25 апреля 2019

Идиоматический способ определения функции в OCaml, которая не принимает аргумент, состоит в том, чтобы аргумент был (), который является значением (единственным значением) типа unit:

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

OCaml не сохраняет результаты функции для последующего повторного использования. Если вам нужно такое поведение, вы должны явно запросить его, используя lazy.

...