Доступ к кортежам SML по переменной индекса


Вопрос прост.

Как получить доступ к кортежу с помощью переменной индекса в SML?

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

val correctValue = #index tuple1 ??

Я надеюсь, что кто-нибудь сможет помочь. Заранее спасибо!

3 7

3 ответа:

Не существует функции, которая принимает целочисленное значение и кортеж и извлекает этот элемент из кортежа. Есть конечно и такие #1, #2, ... функции, но они не принимают целочисленный аргумент. То есть имя "функции" - это #5, а не функция #, примененная к значению 5. Таким образом, вы не можете заменить имя index вместо 5.

Если вы заранее не знаете, в каком месте Кортежа будет находиться нужный вам элемент, вы, вероятно, используете их так, как они не предназначены для использования.

Вам может понадобиться список значений, для которых тип 'a list является более естественным. Затем вы можете получить доступ к n - му элементу с помощью List.nth.

Чтобы немного прояснить, почему вы не можете этого сделать, вам нужно немного больше знаний о том, что такое Кортеж в 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

Итак, в заключение, вы не сможете сделать то, что вы не хотите, так как эти производные формы (или синтаксический сахар, если хотите) не являются динамическими в любом случае. способы.

Один из способов, как сказал Себастьян Пааске, использовать списки. Недостатком является то, что для доступа к N-му элементу списка требуется O(n) вычислений. Если вам нужно получить доступ к элементу за O (1) время, вы можете использовать массивы, которые находятся в базовой библиотеке sml. Вы можете найти информацию о массивах по адресу: http://sml-family.org/Basis/array.html