Внезапно нет, не тролю. Да и кто будет так тролить, слишком толсто же.
Я немножко наверное не так выразился.
Вот есть так сказать столпы дотнета — c# vb.net. Которые точно так же могут работать с дотнетом как и f#.
В чем тогда преимущества f# для разработчика? Я понимаю сугубо научный интерес — изучить и понять, но все же совсем прям переходить не получиться же.
Если параллельно использовать только.
Здравствуйте, -n1l-, Вы писали:
N>Внезапно нет, не тролю. Да и кто будет так тролить, слишком толсто же. N>Я немножко наверное не так выразился. N>Вот есть так сказать столпы дотнета — c# vb.net. Которые точно так же могут работать с дотнетом как и f#. N>В чем тогда преимущества f# для разработчика? Я понимаю сугубо научный интерес — изучить и понять, но все же совсем прям переходить не получиться же. N>Если параллельно использовать только.
F# как язык более выразительный чем шарп или бейсик.
На нем гораздо проще и удобнее писать в функциональном стиле.
Он более жестко типизирован.
Для кого эти преимущества важные тот и будет переходить, остальным смысла нет.
> В чем тогда преимущества f# для разработчика? Я понимаю сугубо научный интерес — > изучить и понять, но все же совсем прям переходить не получиться же.
Другой язык. Мощный.
К тому же ещё он и распараллеливаться должен АВТОМАТОМ.
Здравствуйте, -n1l-, Вы писали:
N>Здравствуйте, FR, Вы писали: FR>>Тролишь же.
N>Внезапно нет, не тролю. Да и кто будет так тролить, слишком толсто же. N>Я немножко наверное не так выразился. N>Вот есть так сказать столпы дотнета — c# vb.net. Которые точно так же могут работать с дотнетом как и f#. N>В чем тогда преимущества f# для разработчика? Я понимаю сугубо научный интерес — изучить и понять, но все же совсем прям переходить не получиться же. N>Если параллельно использовать только.
Разнесли понятие null и понятие "нет значения". Уже за это, по моему, стоит переходить на F#.
Здравствуйте, Kluge, Вы писали:
K>Разнесли понятие null и понятие "нет значения". Уже за это, по моему, стоит переходить на F#.
Нормальным образом это сделать и не потерять в интеропе с остальным .NET миром не получится. Для этого option[T] нужно поднимать на уровень CLR, что по очевидным причинам вряд ли будет сделано.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Kluge, Вы писали:
K>>Разнесли понятие null и понятие "нет значения". Уже за это, по моему, стоит переходить на F#.
H>Нормальным образом это сделать и не потерять в интеропе с остальным .NET миром не получится. Для этого option[T] нужно поднимать на уровень CLR, что по очевидным причинам вряд ли будет сделано.
Это можно делать на границе интеропа, а алгоритмы внутри F# части выиграют в чистоте и наглядности.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Вот эта эвристика "загрузка необходимого кода" мне не очень понятна.
Я согласен на консервативную оценку необходимого. Т.е. если загрузится что-то лишнее — я не очень расстроюсь.
ВВ>Биндинги могут содержать какие-либо действия. Это никак не отслеживается.
Конечно могут. И это никак не отслеживается автоматически. Да, загрузка repl ничего не отлеживает и выполняет все действия в "биндингах". Вы пытаетесь мне доказать, что репл возможен только в чистых языках? Нет, в остальных он тоже возможен, разумеется, требуется прилежание и усидчивость, но программистам на таких языках не привыкать.
ВВ>Вообще непонятно, почему мы акцентируем внимание на этой проблеме — тут проблемы-то нет. "Выполнить выражение, загрузив весь код выше" — это сначала загрузить весь код выше, а потом выполнить выражение. Проблема же не в том, что два раза на кнопку жамкать приходится.
Разумеется не в том. Проблема в том, что "загрузить весь код выше" — нетривиальная проблема даже для программы из 4-х строк, что я показал выше. Отдельно загружать и отдельно выполнять я тоже согласен, но в ml-ном репле "загрузка" и "выполнение" — это все равно примерно одно и то же. Иначе в строгом и императивном языке и быть не может (ну, в каком-нибудь Alice, если мне память не изменяет, модули загружаются лениво — но это как раз тот самый язык с "опциональной ленивостью" про которую говорят, добавляя в библиотеку погремушку типа Lazy, которой для этого на практике недостаточно).
ВВ>А есть какие-либо интересные примеры интеграции REPL и IDE? Не Лексах, а что-то чуть более прямое.
Я таких примеров не видел.
ВВ>В моих глазах тут по сути два разных мира — REPL и IDE. IDE в формате Вижуал Студии предоставляет средства по сути эквивалетные реплу, но делает это по-другому.
По-моему, средства эти не эквивалентные, одно и то же разными способами они не делают — но пересечение по функционалу у них, разумеется, есть.
ВВ>Внешние референсы — типа на какой-нибудь Core — загружаются.
Скорее уж не "типа", а "только". Загружаются они из очень небольшого набора сборок. Собственно только из mscorlib, System.Core и FSharp.Core +/- они и грузятся. Т.е с open LazyList или open System.Xml.Linq ничего не получится — нужно грузить библиотеки вручную, как и файлы.
ВВ>А как должен выглядеть отладчик, расчитанный на ФЯ и в чем заключается "не рассчитанность" дотнетовского отладчика?
Я на этот вопрос как-нибудь отвечу отдельно и развернуто.
ВВ>Поставил брейкпоинт на х — ввожу в watch bar — отлично показывается и разворачивается. Все это в нормальном интерфейсе, сделанном для людей. Все, что я ввожу в watch, остается. Значения удобно рефрешатся. Их можно менять, можно вводить выражения. Ну в общем все так же, как и в C#. ВВ>В Locals, кстати, тоже есть bar.
Ну я, конечно, рад за вас, но у меня вот не показывается, не разворачивается, нет.
ВВ>Да, некрасиво. Неправильно определяется выражение слева. Но, честно говоря это похоже на то, что ты специально пытался такой код написать, чтобы автокомплит обмануть.
Нет, я обнаружил это случайно.
ВВ>В реальности же ты так не напишешь? Такое выражение и читается плохо. Вот так:
Нет, я конструкторы классов так вызываю достаточно часто.
ВВ>Большой проблемой — особенно на фоне Лексаха — я это считать отказываюсь.
Кстати, хорошие новости. В бете новой студии автокомплит тут сработал нормально. так что что-то они все-таки поправили.
ВВ>>>В .NET — несколько другой подход к дебагу, не РЕПЛ-ориентированный. K>>О чем и речь. Отладчик в .net, конечно, отличный (для языка "Java с перламутровыми пуговицами"), а в ФЯ их можно считать, что и нет вовсе.
ВВ>Ну ведь не так это. Отладчик есть, и он работает. Было бы, конечно, неправдой утверждать, что он настолько хорош (сиречь адекватен языку), как отладчик C#. Но все же он... ну работает он, не знаю, что еще сказать.
ВВ>непонятно, каким образом он получает тут какие-то баллы.
Что тут непонятного? Баллы получены за хоть какую-то интеграцию с ghci. Интеграции с fsi у Visual F# можно сказать что и нет.
ВВ>И грешат ахтунгами в стиле — а давайте сначала соберем весь проект, и тогда мы вам сможем тултипы с типами показать.
Сравение некорректно — как я уже писал, тултипов с типами в случае F# нет вообще (в тултипах — документация, фактический тип просматреть нельзя).
ВВ>К какой?
К VS.
ВВ>VisualF# не так уж и плох и существует он по большей степени в парадигме именно VisualStudio, а не РЕПЛА. Проблема в том, что он попросту не доделан. Вернее, даже не так. Проблема в том, что он он не доделывается.
Вот именно. О чем я и говорю.
ВВ>Если бы он имел версию 0.3 и распространялся только как к аддон к шеллу, то претензий не было бы?
Претензий было бы меньше, по крайней мере у меня. Потому что позиционирование совпадало бы с фактическим положением дел. В принципе, заявления о поддержке F# могут быть полезны для распространения ФП в мейнстрим, но разве что тактически, потому что это, скажем прямо, обман — с понятными последствиями в долгосрочной перспективе.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, -n1l-, Вы писали:
N>>Может я чего не понимаю, но зачем нужен F# если есть C#?
K>А зачем вообще программирование, если есть прилежание и усидчивость?
Вы конечно сравнили дуб с обезьяной, шикарный аргумент.
Отсыпьте мне тоже, я хочу попробовать.
Здравствуйте, Klapaucius, Вы писали:
K>Конечно могут. И это никак не отслеживается автоматически. Да, загрузка repl ничего не отлеживает и выполняет все действия в "биндингах". Вы пытаетесь мне доказать, что репл возможен только в чистых языках? Нет, в остальных он тоже возможен, разумеется, требуется прилежание и усидчивость, но программистам на таких языках не привыкать.
Нет, я не пытаюсь доказать, что репл возможен в чистых языках. Я высказываю мнение, что в энергичных грязных языках какой-либо код не должен выполняться неявно. Вот если я выделил мышкой директиву открытия модуля, то вполне логично ожидать, что выполнится код в do-блоках этого модуля. Если же я выделил 2+2, то исполнение этого кода я нахожу не очень логичным.
K>Разумеется не в том. Проблема в том, что "загрузить весь код выше" — нетривиальная проблема даже для программы из 4-х строк, что я показал выше. Отдельно загружать и отдельно выполнять я тоже согласен, но в ml-ном репле "загрузка" и "выполнение" — это все равно примерно одно и то же.
Отдельно значит, что ты сначала выполняешь весь код, создавая тем самым нужный тебе топ левел в репле, а потом гоняешь уже нужные тебе выражения.
Лексах, кстати, примерно это и делает. Собственно, загружать весь код вше было бы неправильно с т.з. семантики Хаскелла.
K>Иначе в строгом и императивном языке и быть не может (ну, в каком-нибудь Alice, если мне память не изменяет, модули загружаются лениво — но это как раз тот самый язык с "опциональной ленивостью" про которую говорят, добавляя в библиотеку погремушку типа Lazy, которой для этого на практике недостаточно).
А можно пример ленивого кода на Хаскелле, который нельзя перевести на код с явными санками?
ВВ>>А есть какие-либо интересные примеры интеграции REPL и IDE? Не Лексах, а что-то чуть более прямое. K>Я таких примеров не видел.
Вот, а почему интересно? Может, это все-таки "два разных человека"?
ВВ>>В моих глазах тут по сути два разных мира — REPL и IDE. IDE в формате Вижуал Студии предоставляет средства по сути эквивалетные реплу, но делает это по-другому. K>По-моему, средства эти не эквивалентные, одно и то же разными способами они не делают — но пересечение по функционалу у них, разумеется, есть.
А какая область не пересекается? Давай все же конкретнее. По большому счету свой эквивалент репла в студии и так есть.
ВВ>>А как должен выглядеть отладчик, расчитанный на ФЯ и в чем заключается "не рассчитанность" дотнетовского отладчика? K>Я на этот вопрос как-нибудь отвечу отдельно и развернуто.
Ну что ж, буду ждать.
ВВ>>Поставил брейкпоинт на х — ввожу в watch bar — отлично показывается и разворачивается. Все это в нормальном интерфейсе, сделанном для людей. Все, что я ввожу в watch, остается. Значения удобно рефрешатся. Их можно менять, можно вводить выражения. Ну в общем все так же, как и в C#. ВВ>>В Locals, кстати, тоже есть bar. K>Ну я, конечно, рад за вас, но у меня вот не показывается, не разворачивается, нет.
Ну я не обманываю же? Какой у тебя f#?
Я вообще окошками locals/autos обычно вообще не пользуюсь, может, там иногда и пропадает что.
Что, если в вотч самому bar ввести тоже не показывается?
N>def f(x) { x.ToLower() } // Error: typing fails on accessing member ToLower in the ? type
N>_ = "ABC" |> f // Error: typing fails on ambiguity between operator |>(string, ? -> ?) overloads
N>
N>Прокатывает, но не проходит. Как говорится, у каждого свои недостатки
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Нет, я не пытаюсь доказать, что репл возможен в чистых языках. Я высказываю мнение, что в энергичных грязных языках какой-либо код не должен выполняться неявно.
Согласен, не должен. Я же говорю, явная загрузка меня тоже устроит. Меня не устраивает загрузка ручная до такой степени, что и загружать ничего не хочется.
ВВ>Вот если я выделил мышкой директиву открытия модуля, то вполне логично ожидать, что выполнится код в do-блоках этого модуля. Если же я выделил 2+2, то исполнение этого кода я нахожу не очень логичным.
Это не логично, но это вырожденный пример, который практического значения не имеет. Тот код, что интересно запустить на практике зависит от объявленных и вычисленных значений выше. 2+2 и так прекрасно работает, так что вместо калькулятора fsi использовать можно, но речь о других применениях, а именно — написании программ.
ВВ>Отдельно значит, что ты сначала выполняешь весь код, создавая тем самым нужный тебе топ левел в репле, а потом гоняешь уже нужные тебе выражения.
Да, это и надо.
ВВ>Собственно, загружать весь код вше было бы неправильно с т.з. семантики Хаскелла.
Конечно, но с точки зрения ML это вполне правильно (с поправками на всякие and и объекты, где они есть)
ВВ>А можно пример ленивого кода на Хаскелле, который нельзя перевести на код с явными санками?
Речь не о том, что можно перевести в принципе, а о том, что можно использовать на практике, т.е. то, что удобно и работает с приличной скоростью. Lazy и прочее не обеспечивают ни первого ни второго, и, соотвественно, почти никогда не используются.
ВВ>Вот, а почему интересно?
По той же самой причине, по которой, например, никто не видел сверхзвукового самолета в 1939-ом году.
K>>По-моему, средства эти не эквивалентные, одно и то же разными способами они не делают — но пересечение по функционалу у них, разумеется, есть. ВВ>А какая область не пересекается? Давай все же конкретнее. По большому счету свой эквивалент репла в студии и так есть.
IDE появились для языков и библиотек в которых на каждое 2+2 полагается три экрана бойлерплейтной обвязки, а сам + именуется как-нибудь вроде НоВГорлоЯУспелВоткнутьИТамДваРазаПовернутьМоеОружье (перегружено для 256 вариантов аргументов). Отсюда очевидны и виды проблем, которые ИДЕ решают, т.е. генерация бойлерплейта и, что более актуально, потому что никаким совершенствованием языка тут делу не поможешь — автоматизированное преобразование кода и навигация по коду. Функциональность репла — т.е. возможность быстро испробовать небольшой фрагмент кода в ИДЕ появится могла только в самой зачаточной форме — ведь в языках, для которых иде разрабатывались не бывает кусков кода одновременно работающих и небольших. Наоборот, репл характерен для языков в которых не нужно писать мегабайты бойлерплейта, а типичная программа вычисляет факториал — так что навигация по ней тривиальна, как, собственно, и ее ручное преобразование. Когда же эти языки внезапно стали применять на практике — проблема навигации по коду встала в полный рост.
ВВ>Ну я не обманываю же?
Да я вас и не обвиняю в этом. Я просто констатирую, что у меня проблема существует.
ВВ>Какой у тебя f#?
4.0.30319.1
ВВ>Что, если в вотч самому bar ввести тоже не показывается?
Нет, не показывается.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, -n1l-, Вы писали:
K>>А зачем вообще программирование, если есть прилежание и усидчивость? N>Вы конечно сравнили дуб с обезьяной, шикарный аргумент.
Аналогия самая прямая. При наличии прилежания и усидчивости в товарных количествах все, что автоматизируется с помощью программирования можно и вручную делать. Но человеческому падению предела нет, даже программировать некоторые не хотят как положено, как отцы и деды завещали: смирять плоть, крепить дух, страдать, становясь лучше — нести свой крест (кресты, решетки и т.д.) т.е. писать на С# и других похожих душеспасительных языках. Вместо этого некоторые программисты, представьте себе, хотят идти по легкому пути — а это уже лень и разложение в квадрате.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll