Re: Inline records
От: samius Япония http://sams-tricks.blogspot.com
Дата: 10.10.09 13:58
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Наличие функций с более чем одним параметром возможно благодаря кортежам. Если функция принимает два параметра один из которых строка, а второй целое, то такая функция записывается как "string * int -> Y". Таким образом типом параметров такой функции является кортеж "string * int". Логично, что и возвращаемое значение может быть так же кортежем, например, "string * int -> string * int".


VD>В чем же проблема? Проблема в том, что простые смертные оперируют конкретикой. Для них мало абстрактных типов аргументов и возвращаемого значения. Им нужны еще названия параметров.


Проблема не только в этом. А так же в том, что запись string*int->Y не совсем соответствует действительности для платформы .NET. В немерле так принято записывать только потому что string->int->Y еще больше не соответсвует действительности.
Допустим, что мы имеем функцию string * int -> string * int, которая принимает "якобы" кортеж (а на самом деле два аргумента через запятую), а возвращает именно кортеж. Проблема в том, что чтобы подать результат функции на ее же вход, потребуется кортеж разделить на части и подать их по-частям. Очевидно, что мы не можем записывать одинаково то что физически является разными вещами (вход и выход).
Т.е. если мы оставляем запись string*int для обозначения кортежа, то функция типа string*int->string*int должна как принимать именно кортеж, так и возвращать его.

Кроме того, мы должны уметь передавать кортежи в функцию, и передача (string, string * int) не должна автоматически преобразоваться в (string * string * int).

VD>Теперь, собственно предложение.


VD>Расширение C#:

VD>
VD>(string ret1, int ret2) FuncName(string param1, int param2)
VD>{
VD>}

VD>(string ret1) FuncName(int param2)
VD>{
VD>}
VD>


Я уже где-то недавно в шутку предлагал (возможно в той теме) вариант с возвратом из метода анонимного типа.
Что-то воде
{string ret1, int ret2} FuncName(string param1, int param2)
{
}

Т.е. хочется скрестить ужа с ежом и получить анонимный тип с позиционным доступом или тупл с именованными свойствами, причем с полной совместимостью по типу, невзирая на имена свойств.
И разрешить не только возвращать такие штуки, но и принимать их и объявлять в теле метода.

{ r1, r2 } = Func(p1, p2);

и

{ string ret1, int ret2 } FuncName(string param1, { string p1, int p2 })

Причем, результат совместим с типом второго аргумента функции.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.