2017-03-26 39 views
1
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/NJ

回答

2

你給是給類型的功能:

val randomList = fn : int -> 'a list 

所以問自己,爲什麼後來是「一個沒有概括爲int? 讓我們看看其他分支中的表達式。

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

表達(E1; E2)計算E1,然後評估和返回E2, 扔掉E1的結果。從那裏,它應該開始有道理,爲什麼它返回'列表

  1. 移動到列表爲參數。
  2. 添加一個傳遞空列表的幫助函數。
  3. 返回的thelist它已經累積的所有隨機數之後。
  4. 當您在評論中所指出它有助於[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; 
+0

好是有道理的。來自Java,SML是完全不同的。感謝您的幫助。我現在唯一的問題是'randomValue'在整個列表中保持不變。每次運行後如何獲得該值以重置?我做隨機數的方式有點令人困惑。我不知道'val r'是怎麼完成的。在java中,我只需要'nextInt',然後'randomValue'就會得到一個隨機值,但在SML中,似乎必須使用3個變量來獲得一個隨機值。 – XXIV

+0

@XXIV更新了代碼'r',封裝了種子的狀態,(實際上是問題)稍微更新了我的答案。 – matt

+0

啊,好吧。我認爲這是種子,但仍然不知道如何處理它。感謝您的鏈接和所有幫助! – XXIV