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

Смешивание Haskell и С++

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

С++ был довольно простым, жестким циклом, который учитывал появление признаков. В основном все это было математикой и простым вводом-выводом. Я фактически контролировал параметры, имея код клея Python, выписывая заголовок, полный #define, и перекомпиляцию. Вид хаки, но он сработал.

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

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

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

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

Ответ 4

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

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

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