HH>P.S. C# это не функциональный язык, это язык с некоторыми функциональными фишками, в плане функциональщины там до Haskell как до Луны.
так с помощью extension methods и https://github.com/louthy/language-ext на C# можно много функционального наваять; проблема с функциональщиной — она редко где нужна и народ, тупо привыкший к enterprise programming, выказывает мало радости, когда брезжит что-то новое и непривычное
Здравствуйте, takTak, Вы писали:
T>так с помощью extension methods и https://github.com/louthy/language-ext на C# можно много функционального наваять; проблема с функциональщиной — она редко где нужна и народ, тупо привыкший к enterprise programming, выказывает мало радости, когда брезжит что-то новое и непривычное
Про C# я немного знаю, т.к. последние 15 лет в основном на нем и пишу.
Тут вопрос в том, что вам нужно: больше удовольствия и знаний (возможно бесполезных) или больше практики.
Изучать функциональщину по C# можно наверно. Но при этом лесом идут алгебраические типы, GADT, классы типов (пока C# 9 (?) еще нет), higher kinded polymorphism, Type Families и т.д.
И C# конечно просто не удобен для функционального программирования в сравнении с Haskell. Ну в Haskell функции каррированы по умолчанию, оператор композиции точка, типы функций пишутся не так громоздко и т.д.
И всякие функторы, монады, комонады, стрелки и т.д. в C# тоже идут лесом. Хотя в Linq есть конечно синтаксический сахар для монад, но без higher kinded polymorphism это профанация.
Но главное даже не это, главное это все эти научные статьи и выступления гиков, где используется Haskell.
Ну и конечно есть языки, которые мощнее Haskell: Idris, Agda, Coq, Lean Theorem Prover...
P.S. Для практики это все конечно не нужно.
Здравствуйте, SkyDance, Вы писали:
KP>>Похоже, у тебя просто нет понимания того, что такое диалект. Диалект – это очень маленькое изменение языка, адаптация языка к другой платформе
SD>Ну так как, ты изучил уже, что же такое Elixir? SD>Или хотя бы посмотрел, как *инсталлировать* Elixir, а?
До сих пор подгорает? Может к специалисту обратишься?
T>>так с помощью extension methods и https://github.com/louthy/language-ext на C# можно много функционального наваять; проблема с функциональщиной — она редко где нужна и народ, тупо привыкший к enterprise programming, выказывает мало радости, когда брезжит что-то новое и непривычное
HH>Про C# я немного знаю, т.к. последние 15 лет в основном на нем и пишу. HH>Тут вопрос в том, что вам нужно: больше удовольствия и знаний (возможно бесполезных) или больше практики.
HH>Изучать функциональщину по C# можно наверно. Но при этом лесом идут алгебраические типы, GADT, классы типов (пока C# 9 (?) еще нет), higher kinded polymorphism, Type Families и т.д.
HH>И C# конечно просто не удобен для функционального программирования в сравнении с Haskell. Ну в Haskell функции каррированы по умолчанию, оператор композиции точка, типы функций пишутся не так громоздко и т.д.
HH>И всякие функторы, монады, комонады, стрелки и т.д. в C# тоже идут лесом. Хотя в Linq есть конечно синтаксический сахар для монад, но без higher kinded polymorphism это профанация.
HH>Но главное даже не это, главное это все эти научные статьи и выступления гиков, где используется Haskell. HH>Ну и конечно есть языки, которые мощнее Haskell: Idris, Agda, Coq, Lean Theorem Prover... HH>P.S. Для практики это все конечно не нужно.
алгебраические типы есть в F#, так как это .NET, то может это перекочует когда-то и в C#,
насчёт GADT, HKTs и прочего- непонятно, нужно ли это вообще: не знаю, насколько просто код со сложными и вложенными типами читается,
C# неудобен с точки зрения написания функций, это так, но зато он довольно быстро понятен тем, кто функциональным программированием не увлекается,
насчёт "функторы, монады, комонады" — я не понял... меня функциональность интересует, в первую очередь, как инструмент для написания понятного кода без try catch, null reference exceptio, if else etc., —
для всех этих задач соответствующие механизмы, функторы, монады в C# есть, тот же Linq во многом по такому принципу и устроен, немного стрёмно, что в майкрософте напридумывали своих служебных слов: Select, selectMany, aggegate вместо общепринятых map, fold ..., но это, наверное, тоже дело привычки с этим как-то примириться или просто использовать свои или чужие расширения с более общепринятым обозначением
Я не спорю по поводу достоинств C# как языка для практического программирования.
Речь идет о том, какой язык больше подходит для изучения функционального программирования.
F# тут немного получше, но в нем также не хватает HKT, и потом F# это обрезанный OCaml, откуда вырезали самое интересное -систему модулей. Одна из мощных фишек в системе модулей этого языка это функторы Functors (слово функтор в OCaml я так понимаю имеет другой смысл, также как слово функтор в C++ имеет третий смысл).
Что касается Linq, то там есть query expression pattern, который интересен тем, что его можно реализовывать для своих классов.
Но функторы в C# определить нельзя, так же как нельзя сделать код, который например будет работать с любой монадой.
interface IFunctor<T> {
T<B> FMap<A, B>(Func<A, B> f, T<A> a);
}
This won’t compile. We can’t refer to T in the typing of FMap as T<B> and T<A>: it’s not expressible in C# and .NET’s type system.
И к тому времени, как в C# появятся алгебраические типы, Haskell уже будет поддерживать зависимые типы.
KP>До сих пор подгорает? Может к специалисту обратишься?
Ага. Мы тут просто с Jose обсуждаем, как бы упростить все эти не шибко удобные процедуры, ибо нету у Elixir'а никого вроде Erlang Solutions, кто выпускал бы бинарные пакеты, и потому язык сложнее продвигать.
(надеюсь, ты знаешь, кто есть Jose Valim, один из директоров Erlang Ecosystem Foundation и изобретатель Elixir'а).
Здравствуйте, SkyDance, Вы писали:
SD>Ага. Мы тут просто с Jose обсуждаем, как бы упростить все эти не шибко удобные процедуры, ибо нету у Elixir'а никого вроде Erlang Solutions, кто выпускал бы бинарные пакеты, и потому язык сложнее продвигать.
SD>(надеюсь, ты знаешь, кто есть Jose Valim, один из директоров Erlang Ecosystem Foundation и изобретатель Elixir'а).
А ты еще более смешной и нелепый, чем кажешься на первый взгляд. С кем бы ты там не обсуждал упрощения "все эти не шибко удобные процедуры" – это мало что меняет. Ну а гопник-ориентированная модель доказательства своей позиции через "кого на районе знаешь" делает аргументированный спор с тобой вообще бессмысленным. Извини, но у меня нет желания что-то тебе доказывать и объяснять, так как идея опускаться на твой уровень мне не кажется привлекательной.
Здравствуйте, SkyDance, Вы писали:
SD>Как много кода ты написал на Erlang и Elixir? Как думаешь, откуда в Elixir названия вроде GenServer или GenEvent?
Если под словом 'Erlang' понимать только язык — то Elixir не является диалектом Эрланга, явно же другой синтаксис (например — rebind).
Если же под 'Эрлангом' понимать способ построения систем — то конечно, Elixir это просто другой способ использывания типовых решений из Эрланга (gen_server, ...).