【问题标题】:Accessing SML tuples by Index Variable通过索引变量访问 SML 元组
【发布时间】:2013-01-03 05:23:18
【问题描述】:

问题很简单。

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

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

val correctValue = #index tuple1 ??

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

【问题讨论】:

  • 猜它很简单,你可以用谷歌搜索一下
  • 我试着用谷歌搜索它。由于我是初学者,我无法找出合适的答案。!

标签: tuples sml


【解决方案1】:

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

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

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

【讨论】:

  • 您实际上不太正确地认为#id 是一个函数。看看我更新的帖子:)
【解决方案2】:

为了澄清一点,为什么你不能这样做,你需要更多地了解什么是 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

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

【讨论】:

  • 谢谢杰斯珀!为此,我决定使用 List。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多