通过索引变量访问SML元组

时间:2013-01-19 17:29:44

标签: tuples sml

问题很简单。

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

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

val correctValue = #index tuple1 ??

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

3 个答案:

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

请注意,类型不会显示为{1: int, 2: string, 3: real}等记录类型。元组类型也是记录类型的派生形式。

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

fn {id=var, ...} => var

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

答案 1 :(得分:8)

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

如果您事先不知道元组中元素的位置,那么您可能会以不打算使用它们的方式使用它们。

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

答案 2 :(得分:1)

一种方式是塞巴斯蒂安帕斯克说使用清单。缺点是您需要O(n)计算来访问列表的第n个元素。如果需要在O(1)时间内访问元素,则可以使用基本sml库中的数组。 你可以在: http://sml-family.org/Basis/array.html