问题很简单。
如何在SML中使用Index变量访问元组?
val index = 5;
val tuple1 = (1,2,3,4,5,6,7,8,9,10);
val correctValue = #index tuple1 ??
我希望,有人可以帮忙。 提前谢谢!
答案 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