Подтвердить что ты не робот

Зачем мне хотеть учиться хэскелл?

Возможный дубликат:
Haskell против процедурного программирования в реальном мире

Несколько раз я слышал, как люди говорили такие вещи, как "Каждый программист должен знать Haskell", "Вы не программист, если не знаете, haskell" и так далее. Тем не менее, я не совсем уверен, не хочу ли я попытаться кратко понять этот язык или нет. Игра с интерпретатором (чтобы получить интуитивное понимание основ) займет не менее нескольких дней (если не недель), и я не совсем уверен, что результат будет стоить того.

Немного фона (чтобы понять мои знания)
Я начал программировать в детстве (где-то между 10 или 13 лет назад) с программируемым калькулятором, перешел на базовый, а затем на сборку без x86 (перепрофилирование умножения и деления, а также создание самомодифицирующего драйвера мыши было весело), ​​pascal, delphi, теперь я использую С++ почти исключительно. Знайте свой путь вокруг оболочки unix, можете писать программное обеспечение на python и, возможно, во что угодно (если у меня есть справочник поблизости), который удаленно напоминает С++ или Pascal (т.е. Блоки, аналогичный контроль потока и т.д.). Специализация - 3D-программирование и шейдеры. "Рыба в воде" с низкоуровневыми операциями (выделение памяти в стиле С, указатели), менее комфортно с очень приближенным ООП (т.е. Когда классы созданы ради классов). Почти полностью самоучка. То есть определенно не новичок, но есть области, где я мог бы улучшить.

Итак... что я мог бы получить от изучения Хаскелла в этот момент? Насколько я знаю, этот язык не очень широко используется, в результате, вероятно, есть меньше библиотек, с которыми он может взаимодействовать (как это было с программированием Delphi - вы можете делать программирование DirectX в delphi, если вы действительно этого хотите, но можете 't писать с ним плагин 3dsmax/майя (ну, вероятно, это возможно, но это, конечно, будет нелегко)). Я также не думаю, что я легко смогу подключить часть кода Haskell в игровой движок.

Итак, какие полезные знания я могу получить от него?

P.S. Я не буду покупать "если вы изучите другой язык, вы, вероятно, узнаете что-то, что может быть полезно".

4b9b3361

Ответ 1

(Конечно, это дублированный вопрос, но я не могу найти его сейчас.)

Вы учите его, чтобы изучить чисто функциональное программирование, которое заставляет вас делать много вещей совершенно по-другому. Вы получаете новый образ мышления. Программирование без состояния? Программирование без эффектов? Все лениво? Сумасшедшая система типа с типом вывода? Какого черта монады? Ваш ум будет неоднократно взорван, но, в конце концов, вы получите новые перспективы/методы от функционального программирования, которые трудно подобрать, не переходя в полномасштабный Haskell.

Проблема с попыткой быть конкретной, заключается в том, что попытка рассказать не-Haskeller о том, что они узнают из Haskell, похоже на попытку объяснить цвет "зеленым" слепым.

Ответ 2

Несколько лет назад многие были удивлены, обнаружив, что один из вводных курсов преподается с использованием языка Haskell в качестве языка программирования! Хотя у меня не было опыта работы с Haskell, я имел некоторый опыт работы с Lisp и другими языками функционального программирования.

Я думаю, что анекдот показывает, как знание может быть полезным, когда вы меньше всего этого ожидаете.


С практической точки зрения: вы, возможно, заметили, что скорость ЦП несколько лет назад достигла предела, и теперь самый практичный способ повысить производительность компьютеров - это установить несколько ЦП. Теперь так получается, что большинство, если не все языки программирования, которые вы знаете, по сути являются однозадачными и подчиняются узкому месту фон Неймана. Очевидным решением является параллельное программирование, но это может быть очень болезненным, если параллельные части вашей программы в конечном итоге разделяют состояние, то есть память - и это чаще всего так.

Оказывается, функциональное программирование - это стиль, который позволяет вам в основном обходить проблемы параллельного программирования с общим состоянием. Иными словами, довольно легко писать программы в стиле FP, которые "естественно" поточнобезопасны и подходят для параллельной обработки. В зависимости от языка, компилятора и аппаратного обеспечения вы можете даже найти (как я недавно это делал) части вашей программы, работающие параллельно, даже не выполняя никакого явного кодирования для параллелизма.

Я часто ошибаюсь, но я предполагаю, что функциональное программирование станет одной из самых актуальных парадигм программирования будущего, поскольку параллельное программирование становится все более важным и более сложным. Хаскель, возможно, не является языком выбора - мой личный фаворит в настоящее время - Clojure - но, возможно, стоит взглянуть на один или несколько языков FP.

Ответ 3

Я также не думаю, что я легко смогу подключить часть кода Haskell в игровой движок.

Если вы хотите писать только 3D-движки, то, возможно, не так много смысла в обучении Haskell.

Если вы хотите быть хорошо продуманным программистом, способным программировать в нескольких парадигмах, и вы в настоящее время знаете только языки C-типа, тогда это стоит посмотреть.

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

Также удобно иметь много инструментов, доступных в вашем наборе инструментов. Некоторые проблемы лучше решаются на одном языке, чем другие. Если у вас 5 разных языков, вы можете выбрать лучший для каждой проблемы. Если вы знаете только 2 или 3 очень похожих языка, тогда некоторые проблемы будут легко разрешены, но другие могут быть более сложными, чем если бы вы использовали язык, который лучше подходит для этой конкретной задачи.

Ответ 4

Если 3D-программирование - это ваша вещь, вас могут заинтересовать некоторые слайды из беседы под названием "Следующие основные языки программирования: перспектива разработчика игр" Тимом Суини, основателем Epic и техническим директором для двигателя Unreal. Он говорил по этому вопросу несколько раз, и он явно очень высоко ценит Haskell.

Ответ 5

Есть несколько вещей, которые вы можете получить, в основном то, как вы думаете о вещах. Например, интересно заметить, что такое минимальный язык. Если вы пройдете через SICP (и те же концепции применимы и к Haskell), вы заметите, что вам вообще не нужен синтаксис цикла. Вам не нужны никакие предопределенные функции, которые работают на больших структурах. Вы можете определить практически все, что вам нужно, если вам предоставлен конструктор/деконструктор cons, или способ его определения, и возможность вызывать функции. Вы можете сами определить все остальное - и это интересное упражнение. И это только верхушка айсберга.

На более практическом уровне, например, пару недель назад я делал домашнее задание по OCaml и стонал: "Почему этот язык $% $% # не имеет call/cc !?!" Когда я заметил то, о чем думал, я был поражен - я бы никогда не пропустил это, если бы не знал, что это такое, и я бы не знал, что это было, если бы я не взглянул на Схему, Хаскелл, Рубин.

Вы можете найти много хороших примеров на конкурсе ICFP; тот, который действительно поразил меня, был этой записью на этом соревновании. Они создали новый язык в Haskell, чтобы решить их проблему.

Ответ 6

Изучение функционального языка будет довольно изменяться от того, к чему вы привыкли. Так что да, вы, вероятно, научитесь чему-то полезному;)

Ответ 7

Я бы сказал, если это тяжелая работа, не делайте этого. В противном случае начните читать это, и вы должны увидеть после 10 минут, если вам скучно, или если вы схвачены и не можете его прочитать.

Ответ 8

Функциональные языки, такие как Haskell, - это другой способ мышления о проблеме. Они полезны для обучения и обучения структурам данных и алгоритмам, поскольку они упрощают эти проблемы.

Если вы используете STL из С++, у которого есть функциональные концепции, похожие на Haskell и другие языки, поэтому наличие основы в Haskell поможет понять, как работает STL.

Если вы используете XSL: T для преобразования XML, это очень функционально в его дизайне.