All streams
Search
Write a publication
Pull to refresh
15
0

User

Send message
Ну не в разы. процентов 10-30%, думаю, можно на практике срезать. Чем больше проект — тем меньше эффект, конечно же.

Если просто 1 в 1 переписать на F# (прям в C# стиле, со всеми этими интерфейсами, наследованием и пр) уже будет больше 30%


Скрины слайдов:
https://imgur.com/a/Ghxapve


Где C# перенял из F# (LINQ, async/await, expression-bodied methods/properties etc), уже выглядит более-менее одинаково.


А если начать использовать F# на полную (да хотя бы DU объявить на 3 строчки вместо портянки из наследуемых классов) там сокращение кода уже на порядок.

F# имеет некоторое количество синтаксического сахара, и на это все.

Так можно про любой язык сказать: Haskell это просто набор синтаксического сахара над Асмом (или Лиспом). Это ж всё Тьюринг полные языки и при должном старании и времени все абстракции одного могут быть выражены в другом.


Называйте как хотите, код на F# в разы меньше кода на C#. Благодаря ли синтаксическому сахару, ML синтаксису или каким-то абстракциям (экспрешны, алгебраические типы, карирование и всё такое прочее).

Странно что у вас такие сомнения по этому заявлению.
Переход на более высокий уровень абстракции убирает часть кода (потому что мы, очевидно, от него абстрагируемся).
Переход с Assembly на C++
Переход с C++ на Хаскель


Переход с C# на F# не такой резкий чтобы прям на порядок уменьшить, но раза в 2 вполне. Я говорю за себя точно (был опыт переписывания с С# на F# одного крупного проектов и несколько мелких), так же есть опыт других людей.


Этот опыт переписывания не такой обширный потому что в последствии понимаешь что проще сразу на F# писать чем потом переписывать.

Нет, самое ближайшее (и оно, конечно, есть в хаскеле) это частичный деконстракт, и выведение типа рекорда для аргумента функции чтобы сразу обращаться к полям
image


Последнюю строчку написать в F# нельзя:
image

Зато теперь похоже на правду.

если в рейтинге активности на гитхабе F# на 44 месте?

Не смущает что статистика устарела на 4 года?..
Чукча не читатель, понимаю.

1) Вы пытаетесь схитрить, сделав вид что в F# не нужна функция, конструирующая Employee
let newEmployee id name email hasAccessToSomething hasAccessToSomethingElse = 
{ Id = id
Name = name
Email = email
HasAccessToSomething = hasAccessToSomething
HasAccessToSomethingElse = hasAccessToSomethingElse }

Это лишь показывает твой невысокий уровень знания F#.
Да, эта функция не нужна.
Если ты так писал (или пишешь) неудивительно что у тебя так горит с языка.

отладчик бессилен

Эту чушь от тебя я уже опровергал в какой-то из прошлых статей про F#, где ты рассказывал то же самое.


Даже ссылку оставлю, освежить тебе память.


F# практически ни где в реальной жизни не используется, соответственно и отладчик не нужен

А ещё можно зажмуриться и повторять себе — F# не существует. Поможет.


Плюс в C# есть такая полезная опция, как реверсинг на лету и go-to-definition в библиотечный код, который так же можно дебажить. Программист на F# нервно курит в сторонке или рассказывает что дебагер нинужен

Декомпиляторов из IL в F# нет, это правда. Или я таких не знаю.
Нервно не курю, дебагером пользуюсь.

Не надо свой опыт 6-ти летней давности втирать людям как актуальный.


  • Linter — fantomas
  • Тулинг — обычный Net Core SDK (dotnet build и погнали). F# компилятор нынче в него включён, ничего ставить не надо, если неткор стоит.
  • Про отсутствие доков, это конечно же прогон. В Hopac дока просто гигантская. Giraffe (на мой взгляд самый перспективный веб фреймворк, т.к. поверх asp.net core) прекрасно документирован.
  • Скорость кода F# медленнее C#? У меня другие данные

Если что, pawlo16 известный в комьюнити F# хейтер. К его словам надо с пудом соли относиться. Ходит по всем F# статьям на хабре и рассказывает как он когда-то не осилил, а Go эт просто космос :)

Но, думается, некоторая «избыточность» кода C# в сравнении с F# картины ничуть не портит. А вот будет ли нетривиальная бизнес-логика столь же «читаема» в коде F#? Как ни крути, в продакшн не обойтись без сонма классов, без многоуровневой иерархии объектов в домене приложения…

Потому — соглашусь с апелляцией к «боевому» коду. Мне интересно было бы почитать разбор мало-мальски сложных проектов на F#, решающих задачи «реального» мира.

Обойтись без сонма классов очень даже можно. Отказываться от них полностью бессмысленно, они полезны. Но строчить классы для ВСЕГО — так же глупо, как всё засовывать в чистые функции.


Про избыточность C# по сравнению с F# неплохо сказано в свежих докладах Антона Молдована и Вагифа Абилова:
https://www.youtube.com/watch?v=4eXthLWzYrk
https://www.youtube.com/watch?v=4x9slVi_RBo


Сам пишу прод на F#, экономит тонну времени.

И тут можно наступить на родовую болезнь C# — отсутвие unit/Void.
Перегрузить Ternvoke для работы с Func<> не получится (вход можно, а выход — нет).


Пример из продакшна. В пайплайнах есть функция tee, которая просто делает сайдэффект над передаваемым аргументом и возвращает его же.


F#:


let tee f x =
    f x |> ignore
    x

C# :


public static class Extensions 
{
    public static T Tee<T>(this T x, Action<T> f)
    {
        f(x);
        return x;
    }
}

Предположим у нас есть функция saveToDb: 'a -> bool (принимает что-то, сохраняет в бд, возвращает успешно или нет)


F# пережовывает что угодно:


"abc"
|> tee Console.WriteLine
|> tee saveToDb
|> ...

C# уже не очень:


"abc"
    .Tee(Console.WriteLine)
    .Tee(saveToDb)//упс, компайл еррор
    ...

Added:
А было бы неплохо объявить на C# так:


public static T Tee<T>(this T x, Func<T, _> f)

Но увы

Все пропозалы — это требования того, чего нет в спецификации. Если этого не требовать, язык перестанет развиваться.


Все кто пишут пропозалы — странные?

Во втором примере вообще желание чего-то странного, я даже толком мысли не понял.

Это пример того что C# это всё же язык про стейтменты. Нельзя куда угодно засунуть какой хочешь экспрешн.
В if-стейтменте можно делать что хочешь (явные блоки { }), но это не выражение, оно ничего не возвращает (поэтому проверки типов у разных веток if нет и быть не может).


В ?-операторе ничего делать нельзя (явные блоки { } не поставишь), но оно обязано возвращать, а т.к. C# не умеет в unit/Void, то писать в ?-операторе unit/Void операции нельзя.

Здесь компилятор F# идёт вверх по коду и ищет первый подходящий объявленный record (в нём обязаны совпадать все поля). И неявно выводит тип Employee у идентификатора employee.


Оно может поломаться если между объявлением
type Employee =
и созданием
let employee = ...
объявить другой рекорд с ровно теми же полями. Тогда компилятор неявно выведет этот самый другой тип у этой же переменной.


Это конечно поломает код (строгая типизация жеж) и вы сразу заметите ошибку в IDE, так что проблем нет. Если такой шадоуинг типов не ломает билд, то значит предыдщий рекорд ничего полезного не делал :)

Добавим чутка скобочек и вот он LISP!

Вообще-то в C# есть (1) тернарный оператор

Ну такое. Это не компилируется:


var flag = true;
var _ = flag? Console.WriteLine("true") : Console.WriteLine("false");

Такое почему-то тоже


var a = 0;
var b = flag ? { Console.WriteLine("true");  a = 1; }
             : { Console.WriteLine("false"); a = 2; };

Так что тернарный оператор в C# конечно уступает expression-based if из F#

Скоро завезут в C# records (с выходом восьмерки)

Бабка на двое сказала. Только пропозал есть с мая. До сих пор в том же состоянии.

Тем не менее, это вполне работающая практика. В golang так делают, в некоторых проектах в nodejs тоже принят такой стиль обработки ошибок. И этот подход можно использовать почти везде, даже в языках, где ООП нет вообще.

В Go не от хорошей жизни так. Как только в языке появляются человеческие типы-суммы об этом ужасе надо забывать. Зачем брать в пример неудачные реализации?

Если мне нужен UI не на веб-стеке, будет ли для меня выгода от использования F# выше чем затраты на его обслуживание?

Я UI не занимаюсь вообще, поэтому это не ко мне :) Знаю что его на F# делают. Ссылки в каментах.


А если вообще — да, плюсы от использования F# могут перекрыть затраты на поиск разрабов F# / перевоспитание C#-истов. Но не для малого бизнеса имхо.

Information

Rating
Does not participate
Registered
Activity