2011-04-14 68 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