Почему F# станет мейнстримом
Холивар про байты в энумах навеяло.
Ведь действительно люди страдают, причем даже не от яп, а от его нелогичности.
Я тут играл на sharplab.io с F# и обнаружил, что он компилит код более эффективный, чем рослин.
т.е. даже технически он во многом лучше шарпа.
К сожалению, все еще сильны технологии построенные на partial классах.
Хотя с точки зрения удобства vs code уже имеет отличную поддержку (лучше чем шарпа).
В райдере вроде еще лучше. Но вот прагматиков еще не хватает.
и да неужели про свифт это правда?
Ну а за корректность уж и говорить нечего, достаточно сравнить SAFE и blazor wasm.
в SAFE вообще нигде не фигурируют рукописные роуты, все генерируется из типов.
в блазор же лишь добавили немного абстракций над dom и js. а следить за склейкой клиента и сервера все равно приходится вручную.
Считаю, прагматикам стоит присмотреться к фаршу, ведь это уже почти мэйнстрим.
Здравствуйте, vaa, Вы писали:
vaa>Холивар про байты в энумах навеяло. vaa>Ведь действительно люди страдают, причем даже не от яп, а от его нелогичности. vaa>Я тут играл на sharplab.io с F# и обнаружил, что он компилит код более эффективный, чем рослин.
Тут ситуация такая: если вы пишете write-only код, то всякие скриптовые языки, и тем более те, что без типизации и с автоконвертацией (js, php) позволяют достичь результата с минимальными усилиями.
И есть довольно большой пласт задач где это то, что требуется от инструмента.
Но когда это долгоживущий проект и/или число чтений кода "неавтором" начинает превышать число 1, понимание что делает код и делает-ли он то, что хотел автор становится сложным.
И способность кода пережевывать разнородные данные только усугубляют возможность дешифровать намерение автора в его куске кода. А то и увести проблему от места реальной ошибки в коде.
И что вопрос enum-ы, что про async-и: автор не разобрался в концепции и требует от инструмента то, чего в нем не было заложено. И соверешенно игнорируют тот момент, что реализация их "хотелок" и "очевидных фич", приведет к большому числу неоднозначностей и мест, где можно выстрелить себе в ногу.
X>И что вопрос enum-ы, что про async-и: автор не разобрался в концепции и требует от инструмента то, чего в нем не было заложено. И соверешенно игнорируют тот момент, что реализация их "хотелок" и "очевидных фич", приведет к большому числу неоднозначностей и мест, где можно выстрелить себе в ногу.
В свое оправдание скажу, что с CE async {} in F# я разобрался быстрее, хотя начал изучать позднее C#,
кроме того Дон Сайм, главный инженер F# core вполне себе понимает, что значит промышленная разработка, т.к. именно на основе работ по F# появились многие фичи в C#.
Хотя бы те же дженерики.
Прагматикам стоит попробовать. Это вкусно!
vaa, вот ты не прав ну ни разу! Понимаешь, ты берёшь какое-то одно свойство языка (специфичное для ВП) и думаешь, что этого достаточно, чтобы завоевать все умы! (я сейчас про "распараллеливаемость" благодаря stateless)
Но ты забываешь, что у языка много граней и выбирать его только за то, что он нагрузит все 256 ядер — ну такое себе... крайне специфичный критерий (например, для обработки крупных данных).
А вот ПОНИМАЕМОСТЬ языка, его удобство стоят чуть ли не на первом месте! Недаром "Си-подобные" языки плодятся как кролики — да потому что if {} — это кратко, удобно, гибко и уж конечно же, никто не променяет императивную форму кода на ФП. Рецепты блюд придуманы для тупых — чтобы пункт за пунктом исполнять инструкцию. Ну так это работает везде! Визарды — это "шаг за шагом" ТОЧНО воспроизводить действия.
Поэтому ФП — это ортогональная мышлению вещь. Да чего доказывать... просто посмотри на рынок труда и сравни, сколько нужно ФП и сколько лабают даже на чистом Си.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, vaa, Вы писали:
vaa>>Считаю, прагматикам стоит присмотреться к фаршу, ведь это уже почти мэйнстрим.
IT>Папки в проект уже можно добавлять или все 100500 файлов по прежнему в одном каталоге?
<ItemGroup>
<Compile Include="Utils\ConsoleLogger.fs" />
<Compile Include="Core\AppCore.fs" />
<Compile Include="Program.fs" />
</ItemGroup>
Hello, Alice!
11:00:10 INFO: It is work!
Здравствуйте, Kolesiki, Вы писали:
K>Здравствуйте, vaa, Вы писали:
vaa>>Почему F# станет мейнстримом
K>vaa, вот ты не прав ну ни разу! Понимаешь, ты берёшь какое-то одно свойство языка (специфичное для ВП) и думаешь, что этого достаточно, чтобы завоевать все умы! (я сейчас про "распараллеливаемость" благодаря stateless) K>Но ты забываешь, что у языка много граней и выбирать его только за то, что он нагрузит все 256 ядер — ну такое себе... крайне специфичный критерий (например, для обработки крупных данных). K>А вот ПОНИМАЕМОСТЬ языка, его удобство стоят чуть ли не на первом месте! Недаром "Си-подобные" языки плодятся как кролики — да потому что if {} — это кратко, удобно, гибко и уж конечно же, никто не променяет императивную форму кода на ФП. Рецепты блюд придуманы для тупых — чтобы пункт за пунктом исполнять инструкцию. Ну так это работает везде! Визарды — это "шаг за шагом" ТОЧНО воспроизводить действия. K>Поэтому ФП — это ортогональная мышлению вещь. Да чего доказывать... просто посмотри на рынок труда и сравни, сколько нужно ФП и сколько лабают даже на чистом Си.
Джеффри Мур считает что нужна лишь малость перепрыгнуть пропасть между фанатами и прагматиками, дело не в том что ЯП плохой, дело в привычках
и умении разглядеть практическую ценность.
Здравствуйте, xpalex, Вы писали:
X>И что вопрос enum-ы, что про async-и: автор не разобрался в концепции и требует от инструмента то, чего в нем не было заложено. И соверешенно игнорируют тот момент, что реализация их "хотелок" и "очевидных фич", приведет к большому числу неоднозначностей и мест, где можно выстрелить себе в ногу.
Ну, я прекрасно понимаю чем грозит неявное преобразование, поэтому и считаю F# лучшим ЯП для дотнет.
type Cmd = | Start = 1 | Stop = 2;;
[<Struct>]
type Cmd =
| Start = 1
| Stop = 2
type Cmd with
member it.GetValue() = int it
static member GetCmd(value : int) = enum<Cmd> value;;
type Cmd with
member GetValue: unit -> int
type Cmd with
static member GetCmd: value: int -> Cmd
Cmd.GetCmd 2;;
val it: Cmd = Stop
it.GetValue();;
val it: int = 2