Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275

Зачем нужен F#?

06.08.2020, 16:30. Показов 47828. Ответов 131
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вы не подумайте, что я злодей. Просто зачем нужен F#, если есть C# или хотя-бы VB.NET, в которых возможностей больше?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.08.2020, 16:30
Ответы с готовыми решениями:

Зачем нужен using?
Пожалуйста подскажите зачем использовать слово using?например пот здесь: using (var reader = new StreamReader(filename))

Зачем нужен Path?
Для чего везде и всюду пихают Path в привязку свойств из DataContext? Вот славная цитатка Всё. Нафига везде пихают ...

Зачем нужен LINQ?
LINQ зачем нужен? Без него можно ли обойтись или вот обязательно понадобится базы данных писать:) Может кто и без этой примочки нормально...

131
Модератор
 Аватар для Curry
5160 / 3508 / 536
Регистрация: 01.06.2013
Сообщений: 7,617
Записей в блоге: 9
30.08.2020, 00:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Shamil1 Посмотреть сообщение
по какой-то причине
По причине односторонней видимости объявлений в F# пришлось рекурсию устраивать через коллбек.
bodyImpl нужно бы использовать в функции bracker, но возникает взаимная рекурсия через 3 функции. По этому применён костыль createParserForwardedToRef.
В коде на Haskell ниже в той теме, который я механически перенёс с F#, костыль не требуется.
На C# я парсек не пробовал, но оно есть.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
30.08.2020, 02:24
Цитата Сообщение от Curry Посмотреть сообщение
В коде на Haskell ниже в той теме
В коде на Хаскель Парсек когда компилируется? Вместе с Вашим кодом? А в коде на С# библиотеки уже скомпилированы.
0
Модератор
 Аватар для Curry
5160 / 3508 / 536
Регистрация: 01.06.2013
Сообщений: 7,617
Записей в блоге: 9
30.08.2020, 06:21
Цитата Сообщение от Shamil1 Посмотреть сообщение
В коде на Хаскель Парсек когда компилируется?
Когда пакет устанавливается. И когда компилируется, это тут не при чём.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
30.08.2020, 15:47
Цитата Сообщение от Curry Посмотреть сообщение
Когда пакет устанавливается. И когда компилируется, это тут не при чём.
Поправьте меня, если я не прав.

F#
1
2
module Math1 =
    let add x y = x + y
В F# эта функция имеет конкретный тип, вычисленный в момент компиляции. Если мы будем компилировать этот модуль отдельно, то получим что-то типа
Assembler
1
2
3
4
5
6
Math1.add:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  ldarg.1     
IL_0003:  add         
IL_0004:  ret
Если мы будет компилировать этот модуль вместе с таким модулем:
F#
1
2
3
module Prog1 =
    let res = Math1.add "1" "2"
    printfn "%s" res
то получим что-то типа:
Assembler
1
2
3
4
5
6
Math1.add:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  ldarg.1     
IL_0003:  call        System.String.Concat
IL_0008:  ret
В Haskell аналогичный модуль невозможно скомпилировать. Компилятор не может знать, какие машинные инструкции понадобятся.
0
Модератор
 Аватар для Curry
5160 / 3508 / 536
Регистрация: 01.06.2013
Сообщений: 7,617
Записей в блоге: 9
30.08.2020, 16:05
Цитата Сообщение от Shamil1 Посмотреть сообщение
В Haskell аналогичный модуль невозможно скомпилировать.
Можно. Но это уже оффтоп. Мне так кажется.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
31.08.2020, 09:07
Цитата Сообщение от Curry Посмотреть сообщение
Можно.
И в какие машинные инструкции скомпилируется add, если неизвестны типы x y и неизвестно, что за функция +?
0
 Аватар для volodin661
6810 / 2308 / 350
Регистрация: 10.12.2013
Сообщений: 7,964
15.09.2021, 01:01
Цитата Сообщение от Shamil1 Посмотреть сообщение
То есть, его можно использовать для админских задач вместо (имхо неудобного) PowerShell
А можно пример админской задачи, которая с помощью REPL F# решалась бы удобнее, чем в оболочке powershell ?
Хотя бы один пример.
Пусть даже не полностью готовый.
Да чорт с ним, пусть даже совсем не готовый, а только самую идею.
А?
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
15.09.2021, 09:37
Цитата Сообщение от volodin661 Посмотреть сообщение
А можно пример админской задачи, которая с помощью REPL F# решалась бы удобнее, чем в оболочке powershell ?
Решал задачу на PowerShell. Вывести то и вывести это. У меня две строчки кода - одна выводит то, другая выводит это. Но вторая ничего не выводит, если её поместить после первой. Если поменять местами, то обе выводят правильно. На F# такого не будет.
Плюс все эти неявные преобразования и прочие неявные вещи. ИМХО неудобный язык. Разве что копипастить и выполнять команды.
0
 Аватар для volodin661
6810 / 2308 / 350
Регистрация: 10.12.2013
Сообщений: 7,964
15.09.2021, 13:22
Shamil1,
То есть, примера не будет ?

Цитата Сообщение от Shamil1 Посмотреть сообщение
ИМХО неудобный язык. Разве что копипастить и выполнять команды.
powershell ( здесь корень shell ), оболочка для выполнения команд ИЁХО неудобна, потому что в ней удобно
выполнять команды. Ну, понятно, да.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
15.09.2021, 14:54
Цитата Сообщение от volodin661 Посмотреть сообщение
powershell ( здесь корень shell ), оболочка для выполнения команд ИЁХО неудобна, потому что в ней удобно
выполнять команды. Ну, понятно, да.
Вы неправильно поняли. "Оболочка для выполнения команд" неудобна для написания скриптов, кроме самых простых. При этом она позиционируется как решение для автоматизации задач, которое включает оболочку командной строки, скриптовый язык и платформу управления конфигурацией.

Цитата Сообщение от volodin661 Посмотреть сообщение
То есть, примера не будет ?
Синхронизировать кастомную локализацию с изменениями ресурсов в патче.
0
 Аватар для volodin661
6810 / 2308 / 350
Регистрация: 10.12.2013
Сообщений: 7,964
15.09.2021, 15:36
То есть, 21 год хитрожопый Джеффри Сновер морочит голову крупной софтверной корпорации,
будучи сам в её рядах, потрачено два десятилетия и миллиард долларов, а на выходе что-то настолько
маловразумительное, что даже REPL вариант языка F# , который никто не собирался и не собирается использовать в качестве платформы для автоматизации, более удобен для подобных задач. Такое вот твоё ИМХО.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Синхронизировать кастомную локализацию с изменениями ресурсов в патче.
Ну и ? А дальше ? Где тут прокололся powershell и засиял F#?


Цитата Сообщение от Shamil1 Посмотреть сообщение
"Оболочка для выполнения команд" неудобна для написания скриптов, кроме самых простых.
На текущий момент стратегия использования оболочки такова: вся тяжесть возложена на специализированные cmdlet,
которые из соображений производительности реализовываются на C#. Особых проблем в написании последних для нужд администрирования на собственно скрипте powershell нет никаких, архитектура и дизайн языка достаточны удобны.
( Отладчик, подсистема тестирования, модули, то, сё ... ).
Сам язык не является образцом совершенства, конечно же и даже отчасти вызывает раздражение, но, тем не менее, его возможности таковы, что никакого другого shell рядом даже стояло.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
15.09.2021, 16:51
Цитата Сообщение от volodin661 Посмотреть сообщение
Особых проблем в написании последних для нужд администрирования на собственно скрипте powershell нет никаких, архитектура и дизайн языка достаточны удобны.
Неудобно, когда результат выполнения строки кода зависит от наличия в коде других строк, на первый взгляд (и на второй) не имеющих никакого отношения к выполняемой строке.
Неудобно, когда без чтения документации нельзя понять, что возвращает функция.
Неудобно, когда язык выполняет неявные преобразования по сложному алгоритму. В общем случае, любой тип может превратить в любой тип. Чаще всего это происходит неожиданно и всплывает далеко, от места ошибки в коде.

Цитата Сообщение от volodin661 Посмотреть сообщение
Ну и ? А дальше ? Где тут прокололся powershell и засиял F#?
На PowerShell писать неудобно, а на F# - удобно.
0
Модератор
 Аватар для Curry
5160 / 3508 / 536
Регистрация: 01.06.2013
Сообщений: 7,617
Записей в блоге: 9
15.09.2021, 17:19
Цитата Сообщение от volodin661 Посмотреть сообщение
его возможности таковы, что никакого другого shell рядом даже стояло
Зря вы мутите холивар PS vs F#, не взлетит. Это если PS сравнивать со скриптами, используемыми как командные пингвинами (bash; питон, даже). Вот тогда много всего будет лететь на вентилятор.

Насчёт PS, то я некогда пытался поработать через него с СОМ-объектом. Ничего не вышло. Знаю что с помощью C# это можно. Наверняка и через F# тоже.
А мало ли что за COM-объект, работа с таким может, и для админской задачи требоваться.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
15.09.2021, 18:06
Curry,
Не в этом дело.

PowerShell
1
2
3
Get-ScheduledTask -TaskPath "\Sample\"
Get-ScheduledTask -TaskPath "\Sample\" | Get-ScheduledTaskInfo
Get-ScheduledTask -TaskPath "\Sample\"
В папке Sample ровно одна задача. Нормальный программист от нормального языка ожидает, что строка 3 выведет то же самое, что и строка 1.

На практике:
Строка 1 выводит две строки текста.
Строка 3 выводит одну строку текста.
А если закомментировать строку 1, то строка 3 выводит тридцать строк текста. Тридцать!

Наверное, этому есть какое-то объяснение, но лично меня это бесит.
0
 Аватар для volodin661
6810 / 2308 / 350
Регистрация: 10.12.2013
Сообщений: 7,964
15.09.2021, 18:31
Про холивары вам виднее
Curry Священные войны 1885 постов
, летайте сами.

Моя реакция была на пассаж от Shamil, что REPL F# для задач администрирования удобнее, чем весь powershell.

И аргумент у него был такой же, да: 'я попробовал что-то, у меня не получилось.'

Добавлено через 10 минут
Цитата Сообщение от Curry Посмотреть сообщение
Насчёт PS, то я некогда пытался поработать через него с СОМ-объектом.
Не могу ничего сказать по поводу регистрации на события от COM обьектов, но искал бы я решение
точно не на данном сайте; SO никто не отменял.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
15.09.2021, 18:40
Цитата Сообщение от volodin661 Посмотреть сообщение
И аргумент у него был такой же, да: 'я попробовал что-то, у меня не получилось.'
Не обманывайте. Аргументы я писал.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
17.09.2021, 13:15
Резюмирую вышесказанное мной:

Когда транслятор выполняет неявные операции, это упрощает задачу, если писать в стиле "напишу, не думая, а транслятор пусть сам решает, что я имел ввиду". Но иногда приводит к неожиданным последствиям. Как, например, в случае знаменитых сишных "if(x=0)" или js-ных "map(parseInt)".

Из всех известных мне ЯП PowerShell - чемпион по количеству и сложности неявных операций. В первую очередь это касается преобразования типов и вывода в консоль.

Формат вывода зависит от контекста (предыдущего вывода). Почему Get-ScheduledTask выдаёт разный результат
Преобразование типов идёт по сложному алгоритму. Примерно так: https://devblogs.microsoft.com... ion-magic/

Проблема усугубляется тем, что эти алгоритмы толком не задокументированы. Кроме того, они зависят от внешних настроек (файлы форматов, зарегистрированные конвенторы) и, потенциально, ведут себя по-разному на разных компьютерах.


Наверное, неявные преобразования удобны, когда тебе нужно выполнять команды в консоли или написать простой скрипт. Проблемы возникают, когда тебе нужно написать сложный скрипт и/или скрипт для других администраторов (на стороне клиентов по всему миру) и/или скрипт, который не перестанет работать на новых версиях ОС (я и с таким сталкивался).


Поэтому лично мне F# более удобен. Но у F# есть два больших недостатка: 1) его мало кто понимает 2) нужно устанавливать дополнительно. Поэтому мне приходится писать на PowerShell (к счастью, редко).
0
Модератор
 Аватар для Curry
5160 / 3508 / 536
Регистрация: 01.06.2013
Сообщений: 7,617
Записей в блоге: 9
17.09.2021, 15:20
Цитата Сообщение от Shamil1 Посмотреть сообщение
Проблемы возникают, когда тебе нужно написать сложный скрипт
Когда нужно написать действительно сложный скрипт, то нужно использовать не скрипт, а компилируемый язык, со строгой статической типизацией, что бы компилятор нас мог проверить и отловить изрядно наших ошибок.
Иначе требуется много времени на отладку и тестирование.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
17.09.2021, 15:39
Цитата Сообщение от Curry Посмотреть сообщение
Когда нужно написать действительно сложный скрипт, то нужно использовать не скрипт, а компилируемый язык, со строгой статической типизацией
Я согласен. Но не всегда выбор языка зависит от меня. Некоторые клиенты не могут устанавливать на сервер никакие приложения, кроме явно указанных в белом списке. Политика их компании, часто связанная с требованиями местных законов.
0
17.09.2021, 15:57

Не по теме:

Цитата Сообщение от Shamil1 Посмотреть сообщение
Некоторые клиенты не могут устанавливать на сервер никакие приложения, кроме явно указанных в белом списке. Политика их компании, часто связанная с требованиями местных законов.
С этим не поспоришь. Хотя и глупо запрещать приложения не в исходниках, а скрипты разрешать. Тот же PS, по умолчанию, запрещён, его разрешать с правами админа надо (да, да вы знаете, это я привожу как пример абсурда с которым приходится мириться).
Альтернативой PS может быть js внутри HTA, я на HTA даже одно время инсталяторы делал.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.09.2021, 15:57
Помогаю со студенческими работами здесь

Зачем нужен EventHandler?
Дана задача добавить кнопку на форму только программным кодом Какую играет роль EventHandler в такой записи mnuExit.Click += new...

Зачем он нужен. ExecuteScalar();
Добрый всем. Может ли мне кто-нить обьяснить зачем нужна эта функция? Как я понял, она возвращает первое значение. Но ведь нужны...

Зачем нужен CancellationToken?
у CancellationTokenSource есть тот-же свойство IsCancellationRequested, и метод Cancel вызывается у CancellationTokenSource. Зачем они...

Зачем нужен кастинг?
Всем привет! Смотрю курсы c# для начинающих. Не могу понять, зачем нужен кастинг. Так зачем он нужен?

Зачем нужен модификатор out
Зачем нужен модификатор out, если можно подставить ref, присвоив переменным нули в начале... using System; class Decompose { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru