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

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

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

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

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

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

37
задан Don Stewart 22 April 2011 в 18:24
поделиться

3 ответа

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

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

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

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

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

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

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

26
ответ дан 27 November 2019 в 04:53
поделиться

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

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

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

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

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

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

7
ответ дан 27 November 2019 в 04:53
поделиться

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

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

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

5
ответ дан 27 November 2019 в 04:53
поделиться
Другие вопросы по тегам:

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