SML Структура даты - PullRequest
       18

SML Структура даты

0 голосов
/ 18 апреля 2020

Я пытался выяснить генерацию случайных чисел в SML. Есть стандартная библиотечная функция, которая требует начального числа sh для каждого вычисления

let
    val seed = Random.rand (123,456)
in
    List.tabulate(5, fn i => Random.randRange (1,100)  seed)
end

val it = [26,39,64,39,84] : int list

. Это работает нормально, но если вы не обновите seed новой парой чисел каждый раз, вы получите то же самое случайные числа. Один из способов получения новых чисел был найден здесь , но это кажется устаревшим, то есть, похоже, оно не работает - или я просто не правильно его использую.

val seed = 
    let
        val Date.DATE(d) = Date.fromTime(Time.now())
        val m            = #minute d
        val s            = #second d
    in
        m,s)
    end

fun random (l,h) = Random.randRange (l,h) seed

В частности, я не могу заставить

val Date.DATE(d) = Date.fromTime(Time.now())

работать. Я пытался

- val Date.DATE(d) = Date.fromTimeLocal(Time.now());

, но я получаю ошибку

stdIn:7392.1-7392.10 Error: unbound variable or constructor: DATE in path Date.DATE
stdIn:7392.1-7392.10 Error: variable found where constructor is required: Date.DATE
stdIn:7392.1-7392.12 Error: constant constructor applied to argument in pattern:bogus

Это, однако, работает

- val mydate = Date.fromTimeLocal(Time.now())
val mydate =
:   DATE
:     {day=17,hour=22,isDst=SOME true,minute=27,month=Apr,
:      offset=SOME (TIME {usec=#}),second=3,wday=Fri,yday=107,year=2020}
:   : Date.date

, но как новичок я не действительно знаю, как извлечь что-нибудь из mydate. Кажется, что Date.DATE(d) = должен «преобразовать» оценку в переменную d, к которой могут обращаться поля записи #minute и #second ... Некоторое объяснение было бы очень полезно. ( Здесь - это структура Date.)

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Недавно был сделан еще один шаг sh к созданию менеджера пакетов SML, smlpkg.

Один из очень немногих доступных пакетов - sml-random.

$ smlpkg add github.com/diku-dk/sml-random
1 голос
/ 19 апреля 2020

FAQ часто устарел и, кажется, использует действительно старую структуру Date.

Это работает для меня:

val seed = 
    let
        val d = Date.fromTimeLocal(Time.now())
        val m = Date.minute d
        val s = Date.second d
    in
        Random.rand (m,s)
    end;

fun random (l,h) = Random.randRange (l,h) seed;

Тест:

- random (1,10);
val it = 7 : int
- random (1,10);
val it = 8 : int
- random (1,10);
val it = 7 : int
- random (1,10);
val it = 4 : int
- random (1,10);
val it = 3 : int
...