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

如何在SML/NJ中递归生成随机填充列表,sml,smlnj,Sml,Smlnj,我试图用随机数填充一个列表。我要去拿 错误警告:由于值限制,类型变量未通用化 被实例化为虚拟类型(X1,X2,…)我看到了一些不同的 可能的原因,但我不明白。我需要做什么 改变我仍然不确定这个函数是否有效,因为我 还没有完全运行它 您提供的功能是提供以下类型: fun randomList(n) = let val theList = [] val min = 1 val max = 75 val nextInt = Random.randRange(min,

我试图用随机数填充一个列表。我要去拿 错误
警告:由于值限制,类型变量未通用化
被实例化为虚拟类型(X1,X2,…)
我看到了一些不同的 可能的原因,但我不明白。我需要做什么 改变我仍然不确定这个函数是否有效,因为我 还没有完全运行它


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

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); 
那么,为什么‘a’不能推广到int? 让我们看看else分支中的表达式

val randomList = fn : int -> 'a list
表达式(e1;e2)计算e1,然后计算并返回e2, 丢弃e1的结果。从那以后,它应该开始明白为什么它会返回一个“a列表”

  • 将列表移动到一个参数
  • 添加一个传递空列表的助手函数
  • 累积所有随机数后返回列表
  • 正如您在评论中所指出的,它有助于提取随机种子r 指向辅助函数的参数,因此随机数生成器不会继续生成相同的数

    我们仍然对randomList的每个调用使用相同的初始种子,因此相同长度的每个调用都将返回相同的列表。 可以在此处找到更好的种子函数:


  • 好吧,这是有道理的。SML来自Java,与Java大不相同。谢谢你的帮助。我现在唯一的问题是整个列表的
    随机值保持不变。如何在每次运行后重置该值?我做随机数的方法有点混乱。我不知道
    val r
    能完成什么。在java中,我只需要
    nextInt
    ,然后
    randomValue
    就会得到一个随机值,但在SML中,似乎必须使用3个变量才能得到一个随机值。@XXIV更新了代码,“r”封装了种子的状态,(实际上就是问题所在)稍微更新了我的答案。啊,好的。我以为是种子,但还是不知道怎么处理。谢谢你的链接和所有的帮助!
    - val foo = ({}; 5);
    val foo = 5 : int
    
    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;