如何访问元组的随机成员?

时间:2011-04-14 01:37:24

标签: functional-programming sml smlnj

我想访问元组的随机成员,但我不确定如何将#n设置为变量。

这是我的代码:

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设置为变量?

非常感谢你!!

2 个答案:

答案 0 :(得分:2)

我想你不能。访问运营商的类型是什么? 如果您想要动态随机访问数据,则应首先将其转换为矢量。

PS:有些语言(Coq,Agda等)可以输入这样的访问操作符,但这需要依赖类型(或者至少是类型级整数加上一些魔法,也许Omega也可以这样做)。

答案 1 :(得分: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)

希望它能以某种方式帮助你。