通过索引变量访问SML元组

Inn*_*elt 7 tuples sml

问题很简单.

如何在SML中使用Index变量访问元组?

val index = 5;
val tuple1 = (1,2,3,4,5,6,7,8,9,10);

val correctValue = #index tuple1 ??
Run Code Online (Sandbox Code Playgroud)

我希望,有人可以帮忙.提前致谢!

Jes*_*erg 9

为了澄清一点,为什么你不能这样做,你需要更多关于SML中元组是什么的知识.

元组实际上表示为SML中的记录.请记住,记录的形式{id = expr, id = expr, ..., id = expr}是每个标识符都是标签.

元组和记录的差异是通过索引元组中元素的方式给出的:#1,#2,... (1, "foo", 42.0)是(等效于)的派生形式{1 = 1, 2 = "foo", 3 = 42.0}.SML/NJ给出该记录的类型可能更好地看出这一点

- {1 = 1, 2 = "foo", 3 = 42.0};
val it = (1,"foo",42.0) : int * string * real
Run Code Online (Sandbox Code Playgroud)

请注意,类型未显示为记录类型,例如{1: int, 2: string, 3: real}.元组类型也是记录类型的派生形式.

实际上#id不是一个函数,因此它不能用变量作为"参数"调用.它实际上是一种派生形式(注意通配符模式行,在记录模式匹配中)

fn {id=var, ...} => var
Run Code Online (Sandbox Code Playgroud)

总而言之,你将无法做你想做的事,因为这些派生形式(或者如果你愿意的话,语法糖)在任何方面都不是动态的.


Seb*_*olm 8

不存在采用整数值和元组的函数,并从元组中提取该元素.当然也有在#1,#2...功能,但这些不走整数参数.也就是说,"函数"的名称是#5,它不是#应用于该值的函数5.因此,您不能替换名称index而不是5.

如果你事先不知道元组中你想要的元素在哪个位置,你可能会以一种他们不打算使用它们的方式使用它们.

您可能需要一个值列表,其'a list类型更自然.然后,您可以使用访问第nth个元素List.nth.