Информация об изменениях

Сообщение Re[12]: Упоротость С++ от 27.08.2023 12:50

Изменено 27.08.2023 15:33 Serginio1

Re[12]: Упоротость С++
Здравствуйте, vdimas, Вы писали:

S>>О чем так упорно говорили немерлисты. Вот в C# эволюция ПМ достигла своего апогея.


V>Не факт.

V>Начиная с C# 7 в каждой версии добавляются новые возможности в PM.
V>С чего ты решил, что этот процесс уже завершён?

Ну насчет апогея я говорил, что уже достиг Немерля.
S>>Но по функциональности все равно проигрывает F#

V>Ты малость поднадоел сегодня нести ерунду...


V>PM в C# у выигрывает у F# с разгромным счётом, ес-но.

V>(сам же ссылки дал — не смотрел, разве?)

Ну вот мое мнение, что Шарп недотягивает до F#.
Но не суть. ПМ очень удобен как туплами, рекордами, объектами, списками.

V>В F# есть только одна конструкция, неизвестная в C# — это явное ветвление по discriminated union, бо такого встроенного в язык типа данных нет в C#, опять бгг.

Кстати
https://code-maze.com/csharp-discriminated-unions-with-oneof/
https://github.com/dotnet/csharplang/blob/main/proposals/discriminated-unions.md

V>Вместо этого C# предлагает ветвиться вообще по любому достижимому типу, где дискриминатором является, собсно... тип!

V>F# в этом месте — мальчик для битья.


S>>https://learn.microsoft.com/ru-ru/dotnet/fsharp/language-reference/pattern-matching

S>>https://learn.microsoft.com/ru-ru/dotnet/csharp/fundamentals/functional/pattern-matching
S>>https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/operators/patterns#list-patterns

V>Ну вот и ознакомься тщательнее, с обязательным пониманием происходящего.



S>> Кстати про head :: tail в C#

S>>
S>> [var head, .. var tail]
S>>


V>Не забывай, что в ФП-языках список представлен линкованным списком CONS-ячеек, что в общем случае убого с т.з. эффективности, хотя позволяет единообразно ссылать на любой хвост в списке.

V>В C# для этого завезут ПМ над Span (конкретно для Span<char> уже завезли).
Это не суть. Просто есть ПМ для списков. Linq в этом случае громозг.

V>И опять получится мощнее, чем в ФП-языках, бо в ПМ можно будет ссылаться не только на хвост списка (как в ФП), а на произвольный подсписок в списке.



S>>Вот у меня и был вопрос про ПМ в С++.


V>Для ветвления по константам он делается в switch/case.

V>(забыл разве?)
Хорошо уговорил, что в C# ПМ мощный. Но ты ушел от самой сути. Что ПМ это мощнейшая штука в ПМ.
ПМ намного мощнее и читабельнее switch/case. О чем так много и упорно говорили немерлисты.


V>Для типов можно однократно накрутить хеплеры, типа такого:

V>https://habr.com/ru/articles/282630/
Интересно. Спасибо. Но уступает ПМ.

V>Более полно есть в Boost:

V>https://boostorg.github.io/hana/index.html#tutorial-quickstart
V>где константы времени компиляции надо оборачивать в типы народе integral_constant<int, 42>, или, используя using (продвинутую версию typedef), определить более короткие int_<42>, char_<'c'> и т.д.

V>Сахар для if-elseif-..-else в плюсах тоже накручивается достаточно просто, хотя и потребует некоего типа-тега, который послужит для привязки, допустим, оператора |.

V>По умолчанию в таких либах делается через простую запятую без дополнительных приседаний.

Интересно. Спасибо. Но это не ПМ. Это все перегрузки операторов и прочая кодогенерация. Чем кстати и плох С++.
Да навернуть можно, что угодно, только вот разбираться и отлаживать сложно.

S>>На что тут же вспомнили лисп (который тоже не чисто ФЯП), что в нем нет ПМ, но он функциональный. И просили дать определение ФП.

S>>На что я ответил, что степень функциональности надо сравнивать с Haskel

V>Не-а.

V>Хаскель ленивый язык и это принципиально, т.к. в нём строится "один большой функционал", который протаскивается по главной монаде main. ))

V>"Разложив" на составляющие происходящее в императивном рантайме, там происходит нечто вроде бесконечного вызова ф-ий, где аргументами являются результаты предыдущих вызовов (плюс новые аргументы, в т.ч. константы), что-то типа args => func1 => (result, args) => func2 => (result, args) => и т.д.

Ну в .Net пошли через yield и анонимные классы для хранения состояния (state mashine).
V>Без ленивости это принципиально не работает.
V>Поэтому, сравнивать с Хаскель бесполезно — это отдельная вселенная даже в мире ФП-языков. ))


S>>а лучше с F# где присутствуют все парадигмы ФП.


V>Дудки, F# — мультипарадигменный, просто его синтаксис заточен на ФП-конструкции, сугубо выразительности оных ради.


V>Собсно, это семейство ML, где не все языки из этого семейства являются чисто-функциональными, навроде Хаскеля.

V>Например, Caml-семейство (откуда F# родом) таковым не является.

V>===========================

V>В общем, утверждение "чем круче в языке ПМ, тем он более ФП-парадигменный" не выдерживает никакой критики, предлагаю тебе от этого утверждения отказаться. ))

Мы говорим не о мультипарадигменный, а о ФП.
ФП в F# мощнее чем в Наскеле?
ФП в С++ уступает C#?
Re[12]: Упоротость С++
Здравствуйте, vdimas, Вы писали:

S>>О чем так упорно говорили немерлисты. Вот в C# эволюция ПМ достигла своего апогея.


V>Не факт.

V>Начиная с C# 7 в каждой версии добавляются новые возможности в PM.
V>С чего ты решил, что этот процесс уже завершён?

Ну насчет апогея я говорил, что уже достиг Немерля.
S>>Но по функциональности все равно проигрывает F#

V>Ты малость поднадоел сегодня нести ерунду...


V>PM в C# у выигрывает у F# с разгромным счётом, ес-но.

V>(сам же ссылки дал — не смотрел, разве?)

Ну вот мое мнение, что Шарп недотягивает до F#.
Но не суть. ПМ очень удобен как туплами, рекордами, объектами, списками.

V>В F# есть только одна конструкция, неизвестная в C# — это явное ветвление по discriminated union, бо такого встроенного в язык типа данных нет в C#, опять бгг.

Кстати
https://code-maze.com/csharp-discriminated-unions-with-oneof/
https://github.com/dotnet/csharplang/blob/main/proposals/discriminated-unions.md

V>Вместо этого C# предлагает ветвиться вообще по любому достижимому типу, где дискриминатором является, собсно... тип!

V>F# в этом месте — мальчик для битья.


S>>https://learn.microsoft.com/ru-ru/dotnet/fsharp/language-reference/pattern-matching

S>>https://learn.microsoft.com/ru-ru/dotnet/csharp/fundamentals/functional/pattern-matching
S>>https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/operators/patterns#list-patterns

V>Ну вот и ознакомься тщательнее, с обязательным пониманием происходящего.



S>> Кстати про head :: tail в C#

S>>
S>> [var head, .. var tail]
S>>


V>Не забывай, что в ФП-языках список представлен линкованным списком CONS-ячеек, что в общем случае убого с т.з. эффективности, хотя позволяет единообразно ссылать на любой хвост в списке.

V>В C# для этого завезут ПМ над Span (конкретно для Span<char> уже завезли).
Это не суть. Просто есть ПМ для списков. Linq в этом случае громозг.

V>И опять получится мощнее, чем в ФП-языках, бо в ПМ можно будет ссылаться не только на хвост списка (как в ФП), а на произвольный подсписок в списке.



S>>Вот у меня и был вопрос про ПМ в С++.


V>Для ветвления по константам он делается в switch/case.

V>(забыл разве?)
Хорошо уговорил, что в C# ПМ мощный. Но ты ушел от самой сути. Что ПМ это мощнейшая штука в ПМ.
ПМ намного мощнее и читабельнее switch/case. О чем так много и упорно говорили немерлисты.


V>Для типов можно однократно накрутить хеплеры, типа такого:

V>https://habr.com/ru/articles/282630/
Интересно. Спасибо. Но уступает ПМ.
Это кстати я так понимаю из область дженериков
https://code-maze.com/csharp-discriminated-unions-with-oneof/
https://github.com/mcintyre321/OneOf/blob/master/OneOf/OneOfT3.generated.cs

V>Более полно есть в Boost:

V>https://boostorg.github.io/hana/index.html#tutorial-quickstart
V>где константы времени компиляции надо оборачивать в типы народе integral_constant<int, 42>, или, используя using (продвинутую версию typedef), определить более короткие int_<42>, char_<'c'> и т.д.

V>Сахар для if-elseif-..-else в плюсах тоже накручивается достаточно просто, хотя и потребует некоего типа-тега, который послужит для привязки, допустим, оператора |.

V>По умолчанию в таких либах делается через простую запятую без дополнительных приседаний.

Интересно. Спасибо. Но это не ПМ. Это все перегрузки операторов и прочая кодогенерация. Чем кстати и плох С++.
Да навернуть можно, что угодно, только вот разбираться и отлаживать сложно.

S>>На что тут же вспомнили лисп (который тоже не чисто ФЯП), что в нем нет ПМ, но он функциональный. И просили дать определение ФП.

S>>На что я ответил, что степень функциональности надо сравнивать с Haskel

V>Не-а.

V>Хаскель ленивый язык и это принципиально, т.к. в нём строится "один большой функционал", который протаскивается по главной монаде main. ))

V>"Разложив" на составляющие происходящее в императивном рантайме, там происходит нечто вроде бесконечного вызова ф-ий, где аргументами являются результаты предыдущих вызовов (плюс новые аргументы, в т.ч. константы), что-то типа args => func1 => (result, args) => func2 => (result, args) => и т.д.

Ну в .Net пошли через yield и анонимные классы для хранения состояния (state mashine).
V>Без ленивости это принципиально не работает.
V>Поэтому, сравнивать с Хаскель бесполезно — это отдельная вселенная даже в мире ФП-языков. ))


S>>а лучше с F# где присутствуют все парадигмы ФП.


V>Дудки, F# — мультипарадигменный, просто его синтаксис заточен на ФП-конструкции, сугубо выразительности оных ради.


V>Собсно, это семейство ML, где не все языки из этого семейства являются чисто-функциональными, навроде Хаскеля.

V>Например, Caml-семейство (откуда F# родом) таковым не является.

V>===========================

V>В общем, утверждение "чем круче в языке ПМ, тем он более ФП-парадигменный" не выдерживает никакой критики, предлагаю тебе от этого утверждения отказаться. ))

Мы говорим не о мультипарадигменный, а о ФП.
ФП в F# мощнее чем в Наскеле?
ФП в С++ уступает C#?