Какого типа placeholder _
От: x-code  
Дата: 31.08.20 07:22
Оценка: :)
Во многих современных языках сейчас есть такая штука — "placehodler" _ (подчеркивание),
которая работает например так
_ = 100; // ничего не происходит
(_, x, _) = (1, 2, 3); // x = 2;

Вопрос — а эта конструкция как-то формализована? Какой тип у "_" ? (зачем нужен тип — например чтобы передать его в шаблон и посмотреть что получится). Если названия типа нет — как бы вы назвали этот тип? (желательно одним коротким словом 3..5 символов)
Re: Какого типа placeholder _
От: Буравчик Россия  
Дата: 31.08.20 09:08
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Вопрос — а эта конструкция как-то формализована? Какой тип у "_" ? (зачем нужен тип — например чтобы передать его в шаблон и посмотреть что получится). Если названия типа нет — как бы вы назвали этот тип? (желательно одним коротким словом 3..5 символов)


Кмк, никакого типа у placeholder нет. Это просто конструкция языка. По-аналогии — какой тип у "if"?
Best regards, Буравчик
Re[2]: Какого типа placeholder _
От: x-code  
Дата: 31.08.20 13:05
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Кмк, никакого типа у placeholder нет. Это просто конструкция языка. По-аналогии — какой тип у "if"?


Нет никакого сомнения что это конструкция языка
но мне интересно, можно ли рассматривать ее как объект некоторого экзотического типа?

вот например void — конструкция языка или тип?
в некоторых языках есть еще unit — аналог void, с одним единственным значением
или еще never — тоже как-бы тип, указывающий что функция не возвращает управление.
Re: Какого типа placeholder _
От: Bill Baklushi СССР  
Дата: 31.08.20 13:29
Оценка: +4
x-code:

XC>Вопрос — а эта конструкция как-то формализована? Какой тип у "_" ? (зачем нужен тип — например чтобы передать его в шаблон и посмотреть что получится). Если названия типа нет — как бы вы назвали этот тип? (желательно одним коротким словом 3..5 символов)


Безымянные переменные, для каждого вхождения "_" разные.
Какой тут может быть общий тип?
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re[3]: Какого типа placeholder _
От: YuriV  
Дата: 31.08.20 14:42
Оценка:
Здравствуйте, x-code, Вы писали:

XC>но мне интересно, можно ли рассматривать ее как объект некоторого экзотического типа?


XC>вот например void — конструкция языка или тип?

XC>в некоторых языках есть еще unit — аналог void, с одним единственным значением
XC>или еще never — тоже как-бы тип, указывающий что функция не возвращает управление.

Зачем? Только если в самом языке такая возможность отсутствует (any, x, any).

В с/с++ void это тип без конструктора, и таким образом
void foo() { return void(); } // is ill-formed
В хаскеле void это тип без значения.
Re: Какого типа placeholder _
От: vsb Казахстан  
Дата: 31.08.20 14:49
Оценка:
Например в Kotlin подходящий тип был бы Any? (предок всех типов). Т.е. в системе типов должен быть тип, от которого унаследованы все остальные типы.

А вообще, имхо, разумней назначать каждому placeholder-у свой тип (выведенный из выражения) и всё. Почему у всех должен быть один тип? Они же концептуально разные, несмотря на одинаковое имя.

Про шаблон — не понял.
Отредактировано 31.08.2020 14:50 vsb . Предыдущая версия .
Re[3]: Какого типа placeholder _
От: samius Япония http://sams-tricks.blogspot.com
Дата: 31.08.20 15:06
Оценка: 10 (1) +4
Здравствуйте, x-code, Вы писали:

XC>Здравствуйте, Буравчик, Вы писали:


Б>>Кмк, никакого типа у placeholder нет. Это просто конструкция языка. По-аналогии — какой тип у "if"?


XC>Нет никакого сомнения что это конструкция языка

XC>но мне интересно, можно ли рассматривать ее как объект некоторого экзотического типа?
Нет, ниже

XC>вот например void — конструкция языка или тип?

От языка зависит.
XC>в некоторых языках есть еще unit — аналог void, с одним единственным значением
если речь об F#, то там unit — совершенно точно тип, и он не аналог void, а ровно наоборот. От плейсхолдера его отличает то, что можно объявить значение типа unit, получить значение, передать его параметром.
Плесхолдер же, хоть и конструкция языка, но не поддается никакому взаимодействю со стороны языка до тех пор, пока мы не обнаружим язык, который явно это позволяет.
XC>или еще never — тоже как-бы тип, указывающий что функция не возвращает управление.
не сталкивался.

Плейсхолдер можно считать объявлением переменной без имени. Однако, можно указать тип этой переменной, например
let (_: int, x, _) = (1, 2, 3)

Отсюда можно вывести что сам плейсхолдер как конструкция языка тип не имеет, но переменную, которую он как бы замещает, тип иметь может. И указание этого типа не есть плейсхолдер. Таким образом, плейсхолдер — это всего лишь имя, которое не используется далее в коде.
Re: Какого типа placeholder _
От: Lazytech Ниоткуда  
Дата: 31.08.20 16:04
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Во многих современных языках сейчас есть такая штука — "placehodler" _ (подчеркивание),


Вообще-то это underscore.

https://www.datacamp.com/community/tutorials/role-underscore-python
Re[4]: Какого типа placeholder _
От: Bill Baklushi СССР  
Дата: 31.08.20 16:26
Оценка:
YuriV:

YV>В с/с++ void это тип без конструктора, и таким образом
void foo() { return void(); } // is ill-formed
В хаскеле void это тип без значения.


Между прочим, такой код не ill-formed, нормально компилируется.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re[2]: Какого типа placeholder _
От: watchmaker  
Дата: 31.08.20 18:04
Оценка: 9 (1) +1
Здравствуйте, Lazytech, Вы писали:

L>Здравствуйте, x-code, Вы писали:


XC>>Во многих современных языках сейчас есть такая штука — "placehodler" _ (подчеркивание),


L>Вообще-то это underscore.

underscore — это название символа.
Символ может обозначать разные конструкции и разные конструкции можут обозначаться разными символами.

Например, = — знак равенства. Но в C-подобных языках он играет роль оператора присваивания, а оператор равенства в них записываться совсем иначе: ==.

Так что совершенно напрасно вы вносите путаницу тут

L>https://www.datacamp.com/community/tutorials/role-underscore-python


Ну в python как раз нет никакого выделенного плейсхолдера. В нём _ — это обычное имя переменной. Ничем не хуже i, j, k, или например foo.
Все типичные конструкции, например, по распаковке точно также будут работать и с другими вариантами:
a, *_, b      = range(100)     # a = 0, b = 99

a, *ignore, b = range(100)     # a = 0, b = 99


Тут просто стиль сложился, что в переменную _ можно записывать то, что дальше использовать не планируется, чтобы не выдумывать каждый раз новое имя или не писать вариации ignore.
Соотвественно, в C++ точно также встречается код
for (const auto& [_, value] : some_map) { 
   // use value
}

Точно так же тут _ — просто имя, призванное показать, что дальше это использовать не планируется.

Но ни в python, ни в с++ не возникает вопроса о типе _ — раз это обычное имя переменной, то оно подчиняется всем правилам для остальных переменных.
Re[5]: Какого типа placeholder _
От: YuriV  
Дата: 31.08.20 19:15
Оценка:
Здравствуйте, Bill Baklushi, Вы писали:

BB>YuriV:


YV>>В с/с++ void это тип без конструктора, и таким образом
void foo() { return void(); } // is ill-formed
В хаскеле void это тип без значения.


BB>Между прочим, такой код не ill-formed, нормально компилируется.

Да, конечно, мой косяк, void это incomplete type который нельзя сделать complete и поэтому не может быть объектов этого типа, массивов и ссылок.
Re: Какого типа placeholder _
От: AlexRK  
Дата: 01.09.20 10:00
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Во многих современных языках сейчас есть такая штука — "placehodler" _ (подчеркивание),

XC>которая работает например так
XC>
_ = 100; // ничего не происходит
XC>(_, x, _) = (1, 2, 3); // x = 2;
XC>

XC>Вопрос — а эта конструкция как-то формализована? Какой тип у "_" ? (зачем нужен тип — например чтобы передать его в шаблон и посмотреть что получится). Если названия типа нет — как бы вы назвали этот тип? (желательно одним коротким словом 3..5 символов)

В говноязыках (а 99% языков — это говноязыки) эта конструкция не формализована. Но формализовать ее можно. Это переменная, тип которой — экзистенциальный тип. То есть "существует некоторый тип, такой, что".

В ц-подобном синтаксисе могло было бы быть что-то вроде:

([some type T] T _, int x) = (1, 2); // x = 2, _ = 1, T = int
Re[3]: Какого типа placeholder _
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.09.20 14:07
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Точно так же тут _ — просто имя, призванное показать, что дальше это использовать не планируется.

Вопрос в том, разрешено ли множественное использование этого имени.

W>Но ни в python, ни в с++ не возникает вопроса о типе _ — раз это обычное имя переменной, то оно подчиняется всем правилам для остальных переменных.


for (const auto& [_, _, value] : some_map) { 
   // use value
}


В С# 7.0+ можно делать так:
(_, _, area) = city.GetCityInformation(cityName);

https://docs.microsoft.com/en-us/dotnet/csharp/discards
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Какого типа placeholder _
От: watchmaker  
Дата: 08.09.20 14:39
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>В С# 7.0+ можно делать так:

S>https://docs.microsoft.com/en-us/dotnet/csharp/discards

Ага, верно. Всё потому, что в этом примере в C# это не переменная, а именно отдельная сущность с семантикой discard с особой поддержкой компилятором.

Собственно, в этом и был поинт, что язык python для демонстрации какой-то особой семантики placeholder'a с именем '_' не подходит, так как в нём такой поддержки нет.


S>Вопрос в том, разрешено ли множественное использование этого имени.

В Python — можно, но это не означает что этот как то специально трактуется или поддерживается интерпретатором. Просто [a, b, a, b] = sequence приводит к тому, что одной переменной значение присваивается дважды (и она принимает значение последнего присваивания).
Ну а в С++ через синтаксис с auto так сделать, очевидно, нельзя. Так как одновременно происходит не только присваивание, но определение имени, а нельзя определить две переменные с одним именем в одном блоке. Но при этом можно сделать так: std::tie(_, a, _) = expr() . Хотя, конечно, так никто не пишет, а пишут std::tie(std::ignore, a, std::ignore) = expr() (тут правда сразу видна проблема с многословностью, из-за которой в плюсах такая конструкция не пользуется популярностью).
Re[4]: Какого типа placeholder _
От: Ops Россия  
Дата: 09.09.20 16:02
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>В С# 7.0+ можно делать так:

S>
S>(_, _, area) = city.GetCityInformation(cityName);
S>

S>https://docs.microsoft.com/en-us/dotnet/csharp/discards

А почему не так? Для наглядности-читаемости?

( , , area) = city.GetCityInformation(cityName);
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: Какого типа placeholder _
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.09.20 05:16
Оценка:
Здравствуйте, Ops, Вы писали:
Ops>
Ops>( , , area) = city.GetCityInformation(cityName);
Ops>

Моя догадка: слишком легко сделать ошибку. Запятая и так уже очень перегружена в C#.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.