SML 日期结构

SML Date structure

我一直在尝试找出 SML 中的随机数生成。有一个标准库函数,每次计算都需要一个新的种子

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,否则你会得到相同的随机数。找到了一种获取新号码的方法 here,但这似乎已过时,即它似乎不起作用——或者我只是没有正确使用它。

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) = 应该 "cast" 评估到变量 d 中,可以通过记录字段 #minute#second 访问...一些解释将不胜感激。 (HereDate 结构。)

常见问题解答非常过时,似乎使用了非常古老的 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

最近又推出了一个 SML 包管理器,smlpkg

sml-random.

是极少数可用的软件包之一
$ smlpkg add github.com/diku-dk/sml-random