Здравствуйте, hardcase, Вы писали:
H>Что-то нечасто я вдел чтобы функция принимала чисто кортеж.
Ну это может быть, к примеру, каррированная (в вашем случае — "частично примененная") функция. В таком случае сценарий не столь уж и редкий.
H>Но я всеже предполагаю, что выбрасывание этой чисто эстетической фичи позволит упростить алгоритм выбора перегрузок и механизм вывода типов, что положительно скажется на скорости компиляции.
А какие проблемы с этим неявным приведением, кроме чисто технических? Неочевидно получается?
Я в принципе вполне понимаю, почему поляки так сделали. Совпадение синтаксиса вызова функции и литерала кортежа — не очень хорошо. Они фактически сделали финт ушами и говорят — они совпадают не просто так. Ведь параметры функции это и есть кортеж. И отсюда следуют все ваши неявные приведения. Т.е. это не просто неявные приведения, это, получается, часть дизайна языка.
Кардинальным решением было бы изменить литерал кортежа на что-то более другое и бесскобочное.
Здравствуйте, hardcase, Вы писали:
H>Но я всеже предполагаю, что выбрасывание этой чисто эстетической фичи позволит упростить алгоритм выбора перегрузок и механизм вывода типов, что положительно скажется на скорости компиляции.
Кстати, альтернатива — придумать более выразительный в плане синтаксиса, чем литерал, явный механизм упаковки аргументов в кортеж. Например так:
def f (x, y)
{
def f (x)
{
f(x, y)
};
if (x <= 0)
y
else
f (x,1) + y
}
f(1,3);
Вместо сообщения о том, что в функцию передается неверное количество параметров получается сообщение:
in argument #1, needed a ?, got (? * ?): the element with index 0 in tuple '(? * ?)' is recursive. This bug can be caused by the parametr to tuple transformation.
ВВ>Я в принципе вполне понимаю, почему поляки так сделали.
Все тоже — хотели как лучше.
ВВ>Совпадение синтаксиса вызова функции и литерала кортежа — не очень хорошо. Они фактически сделали финт ушами и говорят — они совпадают не просто так.
Скажу больше. Никакого совпадения не было. Это было задумано с самого начала. В системе типов функция описывается так: "тип -> тип" и подразумевается, что если параметров более одного, то "тип" — это кортеж:
public variant FixedType : TypeVar
{
...
| Fun { from : TypeVar; [RecordIgnore] public argsCount : int; to : TypeVar;
...
| Tuple { args : list [TypeVar]; }
Потому я и высказываю сомнения, что удастся легко отключить эту фичу.
Выделенное поле я ввел специально чтобы учитывать в эвристике является ли полученная перегрузка прямой или получена в результате картежного преобразования. Ранее в компиляторе было вообще невозможно отличить эти варианты и как следствие невозможно было применять LINQ.
ВВ>Ведь параметры функции это и есть кортеж. И отсюда следуют все ваши неявные приведения. Т.е. это не просто неявные приведения, это, получается, часть дизайна языка.
Так и есть. Но в условиях библиотек написанных для шарпа где таких неявных преобразований нет — это часто приводит к проблемам.
ВВ>Кардинальным решением было бы изменить литерал кортежа на что-то более другое и бесскобочное.
Литерал тут в общем-то не причем. Дело в логике работы с функциями.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
ВВ>>Совпадение синтаксиса вызова функции и литерала кортежа — не очень хорошо. Они фактически сделали финт ушами и говорят — они совпадают не просто так. VD>Скажу больше. Никакого совпадения не было. Это было задумано с самого начала. В системе типов функция описывается так: "тип -> тип" и подразумевается, что если параметров более одного, то "тип" — это кортеж:
А что это дает с точки зрения языка? Т.е. я понимаю, что да, в статьях вроде как написано — считается, что параметры функции описываются через кортеж. Но мне казалось, что это больше "идейное" утверждение. Т.е. завтра можно сказать, что параметры функции ни через какой кортеж не описываются, и функция типа int -> (int * int) имееет на самом деле тип int -> int -> int.
Что-нибудь, кроме этой самой неявной упаковки/распаковки кортежа, будет противоречить этому утверждению?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>А что это дает с точки зрения языка? Т.е. я понимаю, что да, в статьях вроде как написано — считается, что параметры функции описываются через кортеж. Но мне казалось, что это больше "идейное" утверждение. Т.е. завтра можно сказать, что параметры функции ни через какой кортеж не описываются, и функция типа int -> (int * int) имееет на самом деле тип int -> int -> int.
ВВ>Что-нибудь, кроме этой самой неявной упаковки/распаковки кортежа, будет противоречить этому утверждению?
Текущая реализация. А так по идее должно все взлететь.
Надо повнимательнее посмотреть на ситуацию под отладчиком. Возможно удастся просто обрубить распаковку на уровне типизации функций (создания лишних перегрузок).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Плохо — это и так допустимая конструкция.
Используется для создания кортежа из одного элемента?
VD>Да и опять же не очевидно.
Ну тут хз. Интересно было бы посмотреть на другие варианты. Как и на другие варианты бесскобочного литерала для кортежа. Наверняка можно придумать что-нибудь интересное.
Здравствуйте, VladD2, Вы писали:
VD>Скажу больше. Никакого совпадения не было. Это было задумано с самого начала. В системе типов функция описывается так: "тип -> тип" и подразумевается, что если параметров более одного, то "тип" — это кортеж: VD>
VD> public variant FixedType : TypeVar
VD> {
VD>...
VD> | Fun { from : TypeVar; [RecordIgnore] public argsCount : int; to : TypeVar;
VD>...
VD> | Tuple { args : list [TypeVar]; }
VD>
VD>Потому я и высказываю сомнения, что удастся легко отключить эту фичу.
Здравствуйте, VladD2, Вы писали:
VD>Народ! Высказываетесь по этому поводу!
VD>Я тоже склоняюсь, что данную фичу лучше запретить. От нее вреда больше чем пользы.
Может для начала сделать ворнинг с сообщением о том, что в будущем фича будет запрещена?
Здравствуйте, Ka3a4oK, Вы писали:
KK>Может для начала сделать ворнинг с сообщением о том, что в будущем фича будет запрещена?
Тут вопрос в другом — предположительно снос бошки этой "фиче" позволит некисло ускорить вывод типов (а имеено выбор перегрузок) и уменьшить время компиляции.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _nn_, Вы писали:
__>>Есть вероятность это это все таки возможно ?
VD>Дык тут надо пробовать. Так ничего сказать нельзя. Учитывая, что народная поддержка вроде как есть, можно попробовать.