fun randomList(n) = let
val theList = []
val min = 1
val max = 75
val nextInt = Random.randRange(min,max)
val r = Random.rand(1,1)
val randomValue = nextInt r
in
if n = 0 then []
else
(randomValue::theList;
randomList(n-1)) end;
randomList(50);
我正在尝试使用随机数填充列表。我得到了 错误
Warning: type vars not generalized because of value restriction are instantiated to dummy types (X1, X2,...)
我见过一些不同的东西 可能的原因,但我无法弄清楚。我需要什么 更改?我仍然不确定该功能是否有效,因为我 无法完全运行它。
答案 0 :(得分:3)
您提供的功能是提供类型:
val randomList = fn : int -> 'a list
那么问一下,为什么那么'没有概括为int? 让我们看一下 else 分支中的表达式。
- val foo = ({}; 5);
val foo = 5 : int
表达式(e1; e2)计算e1,然后计算并返回e2, 扔掉e1的结果。从那里开始,它应该开始理解为什么它会返回'列表。
正如您在评论中所提到的,拉出随机种子 r 会有所帮助 到辅助函数的参数,因此随机数生成器不会生成相同的数字。
我们仍然为randomList的每次调用使用相同的初始种子,因此每个相同长度的调用将返回相同的列表。 可以在这里找到更好的种子功能: Seeding Sml/NJ RNG
fun randomList (n) = let fun helper (n, s) theList = if n = 0 then theList else let val min = 1 val max = 75 val nextInt = Random.randRange(min,max) val randomValue = nextInt s in helper (n - 1, s) (randomValue::theList) end; in helper (n, Random.rand(1, 1)) [] end;