如何在SML / NJ中递归地生成随机填充的列表

时间:2017-03-26 01:27:34

标签: sml smlnj

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,...)我见过一些不同的东西   可能的原因,但我无法弄清楚。我需要什么   更改?我仍然不确定该功能是否有效,因为我   无法完全运行它。

1 个答案:

答案 0 :(得分:3)

您提供的功能是提供类型:

val randomList = fn : int -> 'a list

那么问一下,为什么那么'没有概括为int? 让我们看一下 else 分支中的表达式。

- val foo = ({}; 5);
val foo = 5 : int

表达式(e1; e2)计算e1,然后计算并返回e2, 扔掉e1的结果。从那里开始,它应该开始理解为什么它会返回'列表

  1. theList 移动到参数。
  2. 添加一个将空列表传递给它的辅助函数。
  3. 累积所有随机数后,返回 theList
  4. 正如您在评论中所提到的,拉出随机种子 r 会有所帮助 到辅助函数的参数,因此随机数生成器不会生成相同的数字。

    我们仍然为randomList的每次调用使用相同的初始种子,因此每个相同长度的调用将返回相同的列表。 可以在这里找到更好的种子功能: Seeding Sml/NJ RNG

  5. 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;