Вопрос

Если бы у вас была возможность иметь приложение, которое использовало бы и Haskell, и C++.Какие уровни вы бы позволили управлять Haskell, а какие — C++?

Кто-нибудь когда-нибудь создавал такую ​​ассоциацию (наверняка)?

(сайт Haskell сообщает, что это действительно просто, потому что в Haskell есть режим, в котором его можно скомпилировать на C с помощью gcc)

Сначала я думал, что буду хранить все операции ввода-вывода на уровнях C++.А также управление графическим интерфейсом.

Это довольно расплывчатый вопрос, но, поскольку я планирую изучать Haskell, я подумывал о том, чтобы делегировать часть работы коду Haskell (на самом деле я учусь программированию), и хочу выбрать какую-то часть, в которой я увижу преимущества Haskell.

Это было полезно?

Решение

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

Преимущество C++ заключается в том, насколько тщательно его можно оптимизировать при необходимости.Вы не думаете о возвышенных монадах, стрелках, частичном применении и составлении чистых функций:с C++ вы можете сразу перейти к голому железу!

Между этими двумя утверждениями есть противоречие.В своей статье «Структурное программирование с go to заявления," Дональд Кнут написал

Я долгое время чувствовал, что талант к программированию во многом состоит из способности легко переключаться с микроскопического на макроскопический взгляд на вещи. то есть, чтобы плавно менять уровни абстракции.

Знание того, как использовать Haskell и C++, а также как и когда это делать. объединить их хорошо разобьют всякие проблемы.

Последний большой проект, который я написал, использовал ИФИ включал использование собственной библиотеки радиолокационного моделирования, написанной на C.Переопределять его было бы глупо, а выражать высокоуровневую логику остальной части приложения было бы затруднительно.Я хранил «мозги» этого процесса в Haskell и вызывал библиотеку C, когда мне это было нужно.

Вы хотите сделать это в качестве упражнения, поэтому я бы рекомендовал тот же подход:напишите смарты на Хаскеле.Сковывание Haskell как раба C++, вероятно, в конечном итоге расстроит вас или заставит вас почувствовать, что вы зря потратили время.Используйте каждый язык там, где его сильные стороны.

Другие советы

Вот как я вижу вещи:

  • Функциональные языки превосходны в трансформируя вещи.Всякий раз, когда вы пишете программы, которые принимают входные данные и отображают/фильтруют/уменьшают их, используйте функциональные конструкции.Замечательные примеры из реальной жизни, в которых Haskell должен преуспеть, дают веб-приложения (вы в основном преобразуете вещи, хранящиеся в базе данных, в веб-страницы).
  • Процедурные языки (ООП-языки являются процедурные) преуспевают в побочных эффектах и ​​взаимодействии между объектами.Их сложно использовать для преобразования данных, но всякий раз, когда вы хотите заняться системным программированием или (двунаправленным) взаимодействием с людьми (любые пользовательские интерфейсы, включая веб-программирование на стороне клиента), они выполняют свою работу чисто.
  • Однако некоторые могут возразить, что пользовательские интерфейсы должны иметь функциональное описание, я отвечу, что хорошо зарекомендовавшие себя фреймворки достаточно просты в использовании с ООП-языками, поэтому их следует использовать таким образом.В конце концов, вполне естественно думать о компонентах пользовательского интерфейса как об объектах и ​​взаимодействии между объектами.
  • IO — это всего лишь инструмент:всякий раз, когда вы преобразуете ввод в вывод, Haskell (или любой другой язык FP) должен выполнять ввод-вывод.Всякий раз, когда вы разговариваете с человеком, C++ (или любой другой язык ООП) должен выполнять ввод-вывод.
  • Плевать на скорость.Когда вы используете Haskell для правильной работы, это эффективно.Когда вы используете C++ или Python для правильной работы, это эффективно.

Поэтому, допустим, я свободно владею Haskell, C, C++ и Python, вот как я пишу приложения:

  • Если основная роль моего приложения заключается в преобразовании данных, я пишу его на Haskell, возможно, с некоторыми низкоуровневыми частями, написанными на C (которые, в свою очередь, могут вызывать некоторые высокотехнологичные низкоуровневые части, написанные на C++, но я бы придерживался с C в качестве интерфейса из соображений переносимости).
  • Если основная роль моего приложения — взаимодействие с пользователем, я пишу его на Python (например, PyQt) и позволяю Python вызывать критичные к производительности процедуры, написанные на C++ (boost::python довольно хорош в качестве генератора привязок).Возможно, мне также придется вызывать подпрограммы, преобразующие или извлекающие данные, которые будут написаны на Haskell.
  • Если мне нужно написать часть приложения на Haskell, я выделяю ее в C-вызываемый API.
  • Иногда приложение Haskell, которое читает данные на стандартный ввод и записывает данные на стандартный вывод, полезно в качестве подмодуля (который вы вызываете с помощью fork/exec или чего-то еще на вашей платформе).Иногда сценарий оболочки является подходящей оболочкой для таких приложений.

Этот ответ — скорее история, чем исчерпывающий ответ, но для своей диссертации по компьютерной лингвистике я использовал смесь Haskell, Python и C++, а также несколько инструментов C и Java, которые я не писал.Я обнаружил, что проще всего запускать все как отдельный процесс, используя Python в качестве связующего кода для запуска программ на Haskell, C++ и Java.

C++ представлял собой довольно простой, плотный цикл, подсчитывавший появление функций.По сути, все, что он делал, это математика и простой ввод-вывод.На самом деле я контролировал параметры, заставляя связующий код Python записывать заголовок, полный #defines и перекомпиляция.Немного хакерски, но это сработало.

Haskell представлял собой всю промежуточную обработку:беру сложные выходные данные различных синтаксических анализаторов C и Java, которые я использовал, фильтрую посторонние данные и преобразую их в простой формат, ожидаемый кодом C++.Затем я взял вывод C++ и преобразовал его в разметку LaTeX (помимо других форматов).

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

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

Подводя итог, если у вас возникла проблема, подобная моей, я бы предложил C++ для части с ограничениями по памяти и критической скорости, Haskell для высокоуровневых преобразований и Python для выполнения всего этого.

Я никогда не смешивал оба языка, но ваш подход кажется мне немного перевернутым.Haskell больше подходит для операций высокого уровня, тогда как C++ можно оптимизировать и он может быть наиболее полезен для узких циклов и другого кода, критичного к производительности.

Одним из самых больших преимуществ Haskell является инкапсуляция ввода-вывода в монады.Пока этот ввод-вывод не критичен по времени, я не вижу смысла делать это на C++.

Что касается графического интерфейса, вы, вероятно, правы.Существует множество библиотек графического интерфейса Haskell, но в C++ есть мощные инструменты, такие как QtCreator, которые значительно упрощают утомительные задачи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top