Кортеж без последнего элемента с правильным типом

Можно ли удалить последний элемент из кортежа безопасным способом для произвольной арности?
Я хочу что-то вроде этого:

[A,B,C] abc = [a,b,c];
[A,B] ab = removeLast(abc);

person guai    schedule 18.09.2016    source источник


Ответы (1)


Нет, к сожалению, это невозможно, причина в том, что тип кортежа представлен в системе типов в виде связанного списка экземпляров Tuple, но система типов не может выражать циклы или рекурсию в сигнатуре функции. (И наличие циклов/рекурсии почти наверняка сделает систему типов неразрешимой.)

Одним из способов, которым мы могли бы, в принципе, решить эту проблему в будущем, было бы иметь встроенный примитив функция типа, которая оценивает тип последнего элемента типа кортежа.

Под «примитивной» функцией типа я подразумеваю функцию типа, которая не может быть написана на самом языке, но вместо этого предоставляется компилятором как встроенная.

В настоящее время на Цейлоне нет таких функций примитивного типа, но есть пара других подобных проблем, которые можно решить таким образом.

person Gavin King    schedule 18.09.2016
comment
Вопрос, как я понял, не в типе последнего элемента, а скорее во всех, кроме последнего. Хотя, думаю, это мало что меняет. - person Paŭlo Ebermann; 19.09.2016