обработка кортежей в SML - PullRequest
0 голосов
/ 17 марта 2012

У меня есть задание, в котором мне нужно взять кортеж и вернуть другой кортеж того же размера с измененными некоторыми элементами. Проблема в том, что я не знаю, как обработать кортеж неопределенного размера. Функция должна быть в состоянии обрабатывать кортежи любого размера. Моя идея состояла в том, чтобы превратить кортеж в список, который я мог бы обработать гораздо проще, создав рекурсивную вспомогательную функцию, чтобы взять элемент # 1 кортежа и превратить его в вызов той же функции, которая давала бы элемент # 2 рекурсия снова, пока не останется никаких элементов, но это просто дает ошибку, когда я добираюсь до # n + 1, где n - общее количество элементов в кортеже. Я поступаю об этом неправильно? Есть ли способ найти размер кортежа? Есть ли способ справиться с этой ошибкой? Я знаю об обработке исключений, но я не уверен, как применить это к его случаю, если это возможно.

вопрос в том, чтобы создать функцию с именем subst, такую, чтобы subst (e ', x) e = [e' / x] e, т.е. функция subst заменяет любое свободное вхождение переменной x в выражении e 'на выражение е. Добавьте соответствующий случай для кортежей.

1 Ответ

1 голос
/ 17 марта 2012

Функция должна иметь возможность обрабатывать кортежи любого размера.

Это невозможно сделать. Кортежи разных размеров совершенно разных и несвязанных типов; не существует типа функции, который был бы достаточно полиморфным, чтобы иметь как 'a * 'b -> ..., так и 'a * 'b * 'c -> ..., если только он не просто типа 'a -> ... (т.е. он вообще принимает любой аргумент, без особого понимания кортежей).

(Встроенные нотации # 1, # 2 и т. Д. Являются перегруженными функциями, которые работают для любого типа кортежа, но это волшебство, которое вы не можете дублировать. Вы даже не можете написать что-то вроде val f = # 1 без предоставления компилятору достаточной информации, чтобы вывести точный тип f, вам нужно написать, например, val f : 'a * 'b -> 'a = # 1, чтобы указать, что f возвращает первое поле пары .)

...