【问题标题】:How to make a randomly populated list recursively in SML/NJ如何在 SML/NJ 中递归地制作随机填充列表
【发布时间】:2017-03-27 01:37:48
【问题描述】:
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,...)我看到了一些不同的 可能的原因,但我无法弄清楚。我需要做什么 改变?我仍然不确定该功能是否有效,因为我 无法完全运行它。

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    你给出的函数是给出类型:

    val randomList = fn : int -> 'a list
    

    那么问,为什么 'a 不能推广到 int 呢? 让我们看看 else 分支中的表达式。

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

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

    1. 列表移至参数。
    2. 添加一个将空列表传递给它的辅助函数。
    3. 在累积所有随机数后返回theList
    4. 正如您在 cmets 中所指出的,它有助于提取随机种子 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;
    

    【讨论】:

    • 好吧,这是有道理的。来自 Java 的 SML 完全不同。感谢您的帮助。我现在唯一的问题是randomValue 在整个列表中保持不变。每次运行后如何重置该值?我制作随机数的方式有点令人困惑。我不知道val r 完成了什么。在java中,我只需要nextInt,然后randomValue会得到一个随机值,但在SML中,你似乎必须使用3个变量来获得一个随机值。
    • @XXIV 更新了代码,'r',封装了种子的状态,(实际上是问题)更新了我的答案。
    • 啊,好吧。我以为是种子,但仍然不知道如何处理它。感谢您提供链接以及所有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2010-09-16
    • 2020-01-11
    • 2011-12-22
    相关资源
    最近更新 更多