2011-04-14 69 views
2

我想訪問一個元組的隨機成員,我不知道如何設置#n一個變量。如何訪問Tuple的隨機成員?

這裏是我的代碼:

val lis = ("a","b","c","d") 
val randNumber = Random.randRange (1,4) (Random.rand (0,1)) 
val randChar = #randNumber lis //this is where its failing 

這是我怎麼會正常訪問,說成員#2:

val lis = ("a","b","c","d") 
val ranChar = #2 lis; 

所以我的問題是我怎麼在設置#2給一個變量上面的例子?

非常感謝你提前!

+1

當你想要一個數組你爲什麼要使用一個元組? – Ingo 2011-04-14 09:27:58

回答

2

有一些解決方法,例如,你可以明確地匹配randNumber並調用相應的成員函數:

val randChar = case randNumber of 
         1 => #1 lis 
        | 2 => #2 lis 
        | 3 => #3 lis 
        | _ => #4 lis 

當然,這其中並沒有很好地進行縮放。另一個解決辦法是改變lis表示要List和使用List.nth

List.nth(lis, randNumber-1) 

希望它可以幫助你以某種方式。

+0

我轉換我的元組的列表,並使用該功能。謝謝!! – AngeloS 2011-04-14 13:18:39

2

我想你不能。接入運營商的類型是什麼? 如果你想動態地隨機訪問你的數據,你應該先將它轉換成一個向量。 PS:有語言(Coq,Agda等),可以在其中鍵入這樣的訪問操作符,但這需要依賴類型(或者至少是類型級整數加上一些魔法,也許歐米茄也可以這樣做) 。

+0

爲什麼,這樣的訪問函數的類型是(在Haskell符號:。FORALL ABC d(A,B,C,d) - > b否魔術在那裏,這是一個普通的HM型方案也見FST和SND 。 – Ingo 2011-04-14 08:58:25

+0

@Ingo,不,他要求的東西像'K:INT - >(A_1,A_2 ...,A_N) - > a_k' – gasche 2011-04-14 09:14:39

+0

@Ingo注意,#1和#2已經不能輸入'FST。 '和'snd'僅爲2 uples定義,但#1適用於任何(非空)元組。 – gasche 2011-04-14 09:19:38