Задать вопрос
Dier_Sergio_Great
@Dier_Sergio_Great
Увлеченный человек

Как функционально программировать для параллельных вычислений на C#?

Много слышу, что за функциональным программированием будущее, и при этом приводят пример F# и Lisp. Одновременно попадается материал о том, что C# так же идет в ногу со временем и имеет функциональную возможность. Но нигде нет материала, чтобы было описание C# как функциональное параллельное программирование.
Где и какой материал на эту тему есть?
.
Я в начале думал, что, мол, F# более перспективный, чем C#, меня синтаксис испугал в F#. А может, не в языке проблема, а в способе программирования? Зачем учить новый велосипед, если можно пользоваться старым?
Я имею ввиду не просто параллельное программирование, а именно, чтобы оно было функциональным. Чтобы не приходилось задумываться над дебагом и изменяемостью объектов.
  • Вопрос задан
  • 476 просмотров
Подписаться 3 Простой Комментировать
Решения вопроса 3
Возможно Вам стоит посмотреть в сторону PLINQ.
Ответ написан
Комментировать
@khimalex
Чисто функционально, как в F#, на C# будет сложно что-то сделать, а так:
Как упоминалось - это PLINQ.
А ещё метод Task.ContinueWith.
Обратите внимание что лучше использовать в сочетании с Task.WhenAll, тогда будет параллельность.
Не помню точно, но то ли Дж. Рихтер упоминал, то ли Ст. Клири, что Task создавали с прицелом на функциональный подход к разработке.
Ещё есть TPL Dataflow и Rx.NET.
Это более высокие уровни абстракции над Task.
И всё это можно объединить как TPL.
Ответ написан
Комментировать
@chibitko
чтобы разрабатывать на C# в функциональном стиле нужно использовать immutable objects - https://habr.com/post/266873/
это не всегда оправдано, т.к. требует больше ресурсов, но позволяет избегать сложных багов с разделяемыми объектами
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
dollar
@dollar
Делай добро и бросай его в воду.
Много слышу, что за функциональным программированием будущее

Решайте конкретные задачи, а не гонитесь за будущим.
Функционально можно писать на большинстве нефункциональных языков. Но зачем?
Ответ написан
Jeer
@Jeer
уверенный пользователь
Привет!
Первое, .net языки транслируются в промежуточный язык (IL) при компиляции. То, что можно написать на F#, можно так же написать на C#, разницы не будет никакой. F# выбирают лишь из-за синтаксиса (кому он нравится).
То есть на F# вы будете писать в функциональном стиле, но это не даст никаких преимуществ перед c#. Lisp и F# так же некорректно сравнивать, у них разные компиляторы и разные механизмы обработки. Если есть желание, попробуйте функциональные языки, вроде lisp. Утверждение, что за ним будущее, спорное. В энтерпрайзе применяют c# и java. И будут применять в будущем.
Второе. Для параллельных вычислений не обязательно писать на функциональных языках. Параллельные вычисления не сложно делать и на c#, но, как уже сказали, далеко не все операции можно распараллелить, это не зависит от языка. А иногда этим и не нужно заниматься. Например, веб программирование. Сервер имеет свои механизмы распараллеливания, он обрабатывает одновременно много различных запросов от пользователей. При этом со стороны программиста не нужно писать что-либо, касаемое параллельности.
Запрос от пользователя - валидация данных - запрос в базу - упаковка ответа - возврат ответа. Чисто теоретически можно распараллелить отдельно взятый шаг, но зачем? Не факт, что это прибавит производительности.

Для информации, вы спрашивали, посмотрите лямда-вычисления на c#
Ответ написан
Комментировать
@DarkByte2015
В F# имхо самый красивый и понятный синтаксис из всех чисто ФП-шных ЯП. Учи дальше и разберешься. Другой вопрос - целесообразность... Я лично не вижу смысла ни в F#, ни в Lisp, Clojure, Haskell... Ну просто вакансий на них почти нет. А зачем учить то что не востребовано. Другой вопрос что во многих современных языках есть элементы ФП-шности. Даже в чистом Си можно передавать указатели на функции в параметрах, не говоря уж о C#. Передача функций как параметры это первый шаг (функции высшего порядка). Простейший пример монад это IEnumerable в C#, а в Java 8 появился тип Optional - монада MayBe. Так что лучший вариант это комбинировать функциональные приемы с ООП в "классических" языках.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы