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

Functional programming 如何访问元组的随机成员?,functional-programming,sml,smlnj,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: 因此,我的问题是如何在上面的示例中将#2设置为变量 提前非常感谢 我想你不能。访问操作员的类型

我想访问元组的随机成员,但不确定如何将
#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:

因此,我的问题是如何在上面的示例中将
#2
设置为变量


提前非常感谢

我想你不能。访问操作员的类型是什么? 如果你想动态随机访问你的数据,你应该先把它转换成一个向量


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

有一些解决方法,例如,您可以显式匹配
randNumber
并调用适当的成员函数:

    val randChar = case randNumber of
                      1 => #1 lis
                    | 2 => #2 lis
                    | 3 => #3 lis
                    | _ => #4 lis
当然,这个不能很好地扩展。另一种解决方法是将
lis
的表示形式更改为
List
,并使用
List。第n个

List.nth(lis, randNumber-1)

希望它能对您有所帮助。

为什么,这样一个访问器函数的类型应该是(在Haskell表示法中:对于所有的AB c d.(a,b,c,d)->b。这里没有魔法,这是一个普通的HM类型方案。另请参见fst和snd。@Ingo,不,他要求的是类似于
k:int->(a_1,a_2…,a_N)的东西->a_k
@Ingo请注意,#1和#2已经无法键入。
fst
snd
仅为2-uple定义,但#1适用于任何(非空)元组。我没意识到他会要求#k,他只是注意到#2。在这种情况下,你对类型的看法当然是对的。为什么你需要数组时要使用元组?我将元组转换为列表并使用了该函数。谢谢!!
List.nth(lis, randNumber-1)