Если бы у вас была возможность иметь приложение, которое будет использовать как Haskell, так и C ++. Какими уровнями вы бы позволили управлять Haskell и какими уровнями вы позволили бы управлять C ++?
Кто-нибудь когда-либо делал такую ассоциацию (конечно)?
(сайт Haskell говорит, что это действительно просто потому что в Haskell есть режим, в котором он может быть скомпилирован на C с помощью gcc)
Сначала я думаю, что я бы сохранил все операции ввода-вывода на слоях C ++. А также управление графическим интерфейсом.
Это довольно расплывчатый вопрос, но поскольку я планирую изучить Haskell, я думал о том, чтобы делегировать некоторую работу коду Haskell (я учусь на самом деле кодирования), и я хочу выбрать какую-то часть, где я увижу Haskell преимущества.
Преимущество Haskell - это мощные абстракции, которые он позволяет вам использовать. Вы думаете не в терминах единиц, нулей, адресов и регистров, а в терминах вычислений, свойств типов и продолжений.
Преимущество C ++ заключается в том, насколько сильно вы можете оптимизировать его при необходимости. Вы не думаете о благородных монадах, стрелках, частичном применении и составлении чистых функций: с C ++ вы можете сразу перейти к голому металлу!
Между этими двумя утверждениями есть противоречие. В своей статье «Структурированное программирование с переходят к
операторам» Дональд Кнут писал
, я долгое время чувствовал, что талант к программированию состоит в основном из способности легко переключаться от микроскопических к макроскопическим представлениям о вещах, т.е. , чтобы плавно изменять уровни абстракции.
Знание того, как использовать Haskell и C ++, а также как и когда их хорошо комбинировать , решит все виды проблем.
В последнем большом проекте, который я написал, использовался FFI , предполагавший использование собственной библиотеки моделирования радаров, написанной на C. Повторная реализация этого была бы глупой и выражающей высокоуровневую логику остальной части системы. приложение было бы болью. Я оставил «мозги» в Haskell и вызвал библиотеку C, когда мне это было нужно.
Вы хотите сделать это в качестве упражнения, поэтому я бы порекомендовал тот же подход: напишите ум на Haskell. Сковывание Haskell как раба C ++, вероятно, в конечном итоге расстроит вас или заставит вас почувствовать, что вы зря потратили свое время. Используйте каждый язык, на котором его сильные стороны.
Этот ответ - скорее история, чем исчерпывающий ответ, но для своей диссертации по вычислительной лингвистике я использовал смесь 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 для выполнения всего этого.
Я никогда не смешивал оба языка, но ваш подход кажется мне немного перевернутым. Haskell больше подходит для высокоуровневых операций, в то время как C++ можно оптимизировать, и он может быть наиболее полезен для узких циклов и другого кода, критичного для производительности.
Одним из самых больших преимуществ Haskell является инкапсуляция ввода-вывода в монады. Пока этот ввод-вывод не критичен по времени, я не вижу причин делать это на С++.
В части графического интерфейса вы, вероятно, правы. Существует множество графических библиотек Haskell, но в C++ есть мощные инструменты, такие как QtCreator, которые значительно упрощают утомительные задачи.