10

问题很简单。

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

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

val correctValue = #index tuple1 ??

我希望有人能帮忙。提前致谢!

4

3 回答 3

10

不存在接受整数值和元组并从元组中提取该元素的函数。当然还有#1, #2, ... 函数,但这些函数不接受整数参数。也就是说,“函数”的名称是#5,它不是#应用于 value的函数5。因此,您不能用名称index代替5.

如果您事先不知道您想要的元素将位于元组中的哪个位置,那么您可能正在以不打算使用它们的方式使用它们。

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

于 2013-01-19T17:50:48.863 回答
9

为了澄清一点,为什么您不能这样做,您需要更多地了解 SML 中的元组是什么。

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

元组和记录的区别在于您对元组中的元素进行索引的方式:#1, #2, ...(1, "foo", 42.0)是 (equivalent with) 的派生形式{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

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

于 2013-01-19T18:07:50.147 回答
1

一种方法是 Sebastian Paaske 所说的使用列表。缺点是您需要 O(n) 计算才能访问列表的第 n 个元素。如果您需要在 O(1) 时间内访问一个元素,您可以使用基本 sml 库中的数组。您可以在以下位置找到有关数组的矿石: http ://sml-family.org/Basis/array.html

于 2015-04-27T15:31:45.157 回答