@Fsharp_chat

Страница 272 из 772
Fill
18.08.2017
08:36:03
И будет ли она полезна для меня? Я неплохо разбираюсь в ООП, но ФП не изучал ещё. Может стоит прочитать что-то конкретно о функциональном программировании?

Nikolay
18.08.2017
08:39:21
Читал кто-нибудь "Программирование на F#" Криса Смита? Стоит ли читать? Насколько полезна книга?
Читал и одновременно решал практические задачи на F#. Для меня было полезно

Fill
18.08.2017
08:41:01
Я начал читать. И стал выполнять практические задачи. Потратил день на это, но я всё ещё не могу реализовать даже сортировку (ручную, без Seq.sort и т.д.). Задумался вот о целесообразности.

Не могу понять, как можно сделать сортировку имея только иммутабельные данные

Google
Artemy
18.08.2017
08:42:24
Вопрос первый - куда это поле будет биндиться?
К свойству Nodes библиотечного контрола диаграммы. Оно должно содержать коллекцию узлов диаграммы, которые будут отображены на полотне.

Artemy
18.08.2017
08:43:21
Вопрос второй - предполагается ли сценарий частичного обновления данных
Можно, пожалуйста, уточнить, что под этим понимается?

Не могу понять, как можно сделать сортировку имея только иммутабельные данные
Не проблема. Просто вместо того, чтобы модифицировать изначальную коллекцию, на каждое изменение при сортировке создаётся новая.

Наверное, с непривычки звучит как не очень эффективный способ, но только так с неизменяемым и можно работать.)

Fill
18.08.2017
08:49:00
Наверное, с непривычки звучит как не очень эффективный способ, но только так с неизменяемым и можно работать.)
т.е. для каждого элемента коллекции a я создаю новую коллекцию b, где что-то переставлено.

Fill
18.08.2017
08:51:06
Наверное, с непривычки звучит как не очень эффективный способ, но только так с неизменяемым и можно работать.)
причем, как я понимаю, я могу использовать в F# и мутабельную коллекцию, но это - плохая практика. Так?

Vasily
18.08.2017
08:51:10
Тем не менее, это не отменяет факта, что таки рекурсия явная

Fill
18.08.2017
08:51:41
Ну как плохая
если я пишу в фп стиле

Vasily
18.08.2017
08:51:57
Если в фп стиле, то да, плохая

Но есть сценарии, когда нужны мутабельные коллекции

Google
Artemy
18.08.2017
08:52:54
причем, как я понимаю, я могу использовать в F# и мутабельную коллекцию, но это - плохая практика. Так?
Ну если смотреть на F# как чистое ФП, то да. А если нужно просто решить задачу и в ней реально нужна изменяемость, то почему бы не использовать её

Fill
18.08.2017
08:53:36
Я понял. Если я всюду в коде создаю кучу новых коллекций, никто не скажет мне, что я дурак и сожрал всю память, ведь парадигма этого требует.

То-есть если у меня есть город, и мне нужно выключить свет в одной квартире, я создаю новый город, в котором в той кваритре свет выключен

Я всё правильно понял?

Artemy
18.08.2017
08:54:57
Лол, прикольный пример.)

Ну типа того

Vasily
18.08.2017
08:55:30
Если для того, чтобы выключить свет в квартире, нужно пересоздавать город, что-то идет не так

Fill
18.08.2017
08:55:57
Видимо, в фп нам не нужно иметь столь большие объекты

Vasily
18.08.2017
08:56:16
В фп имеет смысл продумывать доменную область

Fill
18.08.2017
08:56:23
?

Vasily
18.08.2017
08:56:44
Типы, взаимосвязи между ними этц

Artemy
18.08.2017
08:56:47
Там обычного списка хватит
А когда понадобится ObservableCollection?

Fill
18.08.2017
08:57:11
Типы, взаимосвязи между ними этц
это в любом П нужно продумывать)

в любом случаае, спасибо за ваш фидбэк

Vasily
18.08.2017
08:57:38
А когда понадобится ObservableCollection?
Он был придуман для того, чтобы типа при добавлении объекта в коллекцию не пересоздавать CollectionViewSource

Artemy
18.08.2017
08:59:56
В моём случае этого не происходит?

в любом случаае, спасибо за ваш фидбэк
Такой себе фидбэк получился. К сожалению, не знаю, как лучше в ФП быстрее войти. Сам начинал с Haskell. Но навряд ли это единственный верный и лучший путь.)

Fill
18.08.2017
09:13:41
Такой себе фидбэк получился. К сожалению, не знаю, как лучше в ФП быстрее войти. Сам начинал с Haskell. Но навряд ли это единственный верный и лучший путь.)
Да уж. Тут вся и проблема, что я начинал разрабатывать с ООП. И теперь, боюсь, мой мозг испорчен. Заметил за собой, что даже простейшую задачу начал решать десятком интерфейсов с фабриками и иньекциями, потому и решил попробовать F#. Но у меня нихрена не получается, потому что решение проблем с точки зрения ФП для меня сейчас - дикость похлеще кучи интерфейсов.

Artemy
18.08.2017
09:14:41
А, ну я начал Haskell на 2-м курсе, когда только начинал изучать ООП.

> Но у меня нихрена не получается, потому что решение проблем с точки зрения ФП для меня сейчас - дикость похлеще кучи интерфейсов. Со временем пройдёт, если регулярно практиковаться. И будет ничуть не сложнее, чем решать в императивном стиле.

Google
Pavel
18.08.2017
09:21:40
Да уж. Тут вся и проблема, что я начинал разрабатывать с ООП. И теперь, боюсь, мой мозг испорчен. Заметил за собой, что даже простейшую задачу начал решать десятком интерфейсов с фабриками и иньекциями, потому и решил попробовать F#. Но у меня нихрена не получается, потому что решение проблем с точки зрения ФП для меня сейчас - дикость похлеще кучи интерфейсов.
Мне кажется не стоит сразу загонятся всеми фичами ФП. Самый хороший способ: решать простые задачи, при чем не загоняясь вопросами "А это трушная функциональщина или нет?" . Можно даже решать одну и туже задачу на знакомом ООП языке и на F# одновременно.

Artemy
18.08.2017
09:22:50
Я с помощью этого курса начинал: https://www.edx.org/course/introduction-functional-programming-delftx-fp101x-0

Pavel
18.08.2017
09:23:12
https://thomasbandt.com/the-problem-with-fsharp-evangelism статья о том, почему C# девами сложно рассказать про приемущества F#. Думаю все с этим сталкивались :)

Fill
18.08.2017
09:23:48
спасибо

Iskander
18.08.2017
09:28:51
Могу посоветовать курс Мартина Одерски на Coursera, вроде назвался Introduction to Functional Programming on Scala. Да, Scala != F#, но они похожи тем, что являются мультипарадигменными, OOP+FP, а в этом курсе концепция ФП объясняется очень даже неплохо

Artemy
18.08.2017
09:36:51
Да, точно

Если что, на Рутрэкере несколько F#-курсов с Pluralsight есть

Evgeniy
18.08.2017
09:49:32
Универсальный Мутатор! http://fssnip.net/7Tu?utm_source=dlvr.it

@fvnever Тебе должно понравиться.

Vasily
18.08.2017
09:52:42
Прикольная штука на самом деле

Andrew
18.08.2017
09:53:21
@fvnever Тебе должно понравиться.
но зачем он мутирует строки?...

Vasily
18.08.2017
09:53:33
На самом деле есть сценарии, где требуется мутация всех строк

Andrew
18.08.2017
09:54:38
например?

Mike
18.08.2017
10:28:55
То-есть если у меня есть город, и мне нужно выключить свет в одной квартире, я создаю новый город, в котором в той кваритре свет выключен
Ну да. Компилятор и библиотеки достаточно умные, что бы старый город разрушить и ресурсы переиспользовать. Кстати, в некоторых языках (Mercyru, Clean) ввод/вывод делается примерно так: функции передается старый мир, а она возвращает новый - так гарантируется последовательность операций.

Vasily
18.08.2017
10:35:01
например?
Я встречался с сценариями, где в графе объектов надо один айдишник на другой заменить

Т.е. условно был 23, надо заменить на 456

Графы сложные причем и большие

Andrew
18.08.2017
10:36:57
заменить значение в поле объекта - это одно, а заменить символы внутри строки...

Google
Vasily
18.08.2017
10:37:26
Ну может и такой сценарий подъехать

Andrew
18.08.2017
10:37:34
строки в дотнете не просто так немутабельные

Artem
18.08.2017
10:39:16
строки в дотнете не просто так немутабельные
а почему? я гуглил как-то, нашёл мол потому что это Security & thread safe

или есть ещё причины?

Andrew
18.08.2017
10:40:10
а почему? я гуглил как-то, нашёл мол потому что это Security & thread safe
Да, это все актуально, но куда более частая штука - это GetHashCode()

Artem
18.08.2017
10:41:01
Да, это все актуально, но куда более частая штука - это GetHashCode()
я его не использовал (явно. неявно классы которыя я использую мб его где-то и вызывали)

Andrew
18.08.2017
10:41:23
его использует например Dictionary

Aleksander
18.08.2017
10:41:28
и интернирование

Andrew
18.08.2017
10:41:50
вот в Ruby например строки мутабельные (по крайней мере когда-то были)

и поэтому можно было сделать x = "test" dict[x] = 1 x.replace!("e", "o")

и после этого нужно вызывать у словаря метод, пересчитывающий заново хеши всех ключей

иначе корректная работа не гарантируется

потому что хеш-код строки больше не соответствует ее значению

в общем, менять _значение_ строк в дотнете - это примерно то же, что в С++ #define TRUE rand() < 0.9

Dmitry
18.08.2017
10:50:12
И будет ли она полезна для меня? Я неплохо разбираюсь в ООП, но ФП не изучал ещё. Может стоит прочитать что-то конкретно о функциональном программировании?
На Lynda.com хороший курс https://www.lynda.com/F-tutorials/Develop-Financial-Applications-F/516573-2.html - от базовых основ до вполне интересных концепций, и недолгий

Google
Friedrich
18.08.2017
10:51:18
То-есть если у меня есть город, и мне нужно выключить свет в одной квартире, я создаю новый город, в котором в той кваритре свет выключен
Хорошо бы, чтобы город был персистентной структурой данных. Тогда создание нового города, который как старый, но с изменённым состоянием квартиры — дешёвая операция.

Andrew
18.08.2017
10:51:50
Классный пример.)
вот есть целая подборка, которую я иногда перечитываю: https://github.com/kitcambridge/evil.js/blob/gh-pages/evil.js

Friedrich
18.08.2017
10:53:31
а почему? я гуглил как-то, нашёл мол потому что это Security & thread safe
Строки иммутабельные потому, что их шарить нужно. Если б не было шаринга строк (т.е. исключаем интернирование, а лучше всего вообще превращаем их в value-тип) — тогда не было бы проблем с мутабельностью. Но много памяти бы замусоривалось копиями строк.

в общем, менять _значение_ строк в дотнете - это примерно то же, что в С++ #define TRUE rand() < 0.9
А твой аргумент говорит о недопустимости использования мутабельных ключей в словаре. Это не только про строки. Но и такой большой проблемой, на мой взгляд, не является.

Artem
18.08.2017
10:55:08
а в с++ как? не тот тип, который стринг там прикрутили, а старый добрый char* если я делаю char*x="qwe"; x[1]='Z'; ?

я просто плюсы тыкал когда совсем молодой и неопытный был

не помню уже

Friedrich
18.08.2017
10:55:36
Ну то есть мутирование интернированных строк ломает вообще всю программу, ломает в неожиданных местах. А изменение ключей в словаре само по себе сломает только словари, в которых это значение использовалось в качестве ключа. Если нет интернирования — то это довольно локальная опасность.

Чтобы получить мутабельную строку — этот текст нужно будет скопировать в изменяемую область памяти. А дальше, да, они мутируются, но в C++ есть семантика, чтобы запрещать мутации там, где это целесообразно.

В дотнет-языках (которые я знаю) такой семантики нет.

Fill
18.08.2017
10:57:41
F# поддерживает ООП. Решай задачи как удобно
И зачем мне тогда F#? Я взял его для изучения фп, очень слабо представляю себе его использование в реальных тасках

Friedrich
18.08.2017
10:58:15
а в с++ как? не тот тип, который стринг там прикрутили, а старый добрый char* если я делаю char*x="qwe"; x[1]='Z'; ?
Куда интереснее, когда ты из дотнета свою «иммутабельную» строку передаёшь в нативный код, а он там её фигачит, и ломает тебе кэш интернирования, словари и вообще всё на свете. Вот это православно ?

Friedrich
18.08.2017
10:59:19
ну смотря как передавать, можно же как-то сказать шоб не трогали. или дать копию
Да, можно передавать безопасно. Например, StringBuilder передать — он отмаршаллится как надо.

Но, заметь, в него ты явным образом скопируешь содержимое какой-то строки.

А неаккуратным интеропом можно запросто поотстреливать себе все конечности.

Vlad
18.08.2017
11:00:50
там вроде же еще есть какие-то приколы, что строки по ссылке кроссдоменно передаются вместо копирования, или там нечем ломать?

Artem
18.08.2017
11:00:57
ну мне пока не приходилось интеропить, кроме как в универовских лабах

Страница 272 из 772