Я написал заявление, чтобы сбалансировать национальный график выработки электроэнергии для портфеля электростанций с торговой позицией для энергетической компании. Компоненты клиента и сервера были на C #, но механизм вычислений был написан на F #.
Использование F # для устранения сложности, лежащей в основе этого приложения, наглядно демонстрирует привлекательное место для языка в корпоративном программном обеспечении, а именно: алгоритмически сложный анализ больших наборов данных. Мой опыт был очень позитивным. В частности:
Единицы измерения Промышленность, в которой я работаю, изобилует единицами измерения. Уравнения, которые я реализовал (часто геометрического характера), касались единиц времени, мощности и энергии. Наличие системы типов, проверяющей правильность единиц входов и выходов функций, значительно экономит время, как с точки зрения тестирования, так и чтения / понимания кода. Это устраняет целый класс ошибок, которые были подвержены предыдущим системам.
Исследовательское программирование Работа с файлами сценариев и REPL (F # Interactive) позволила мне более эффективно исследовать пространство решений перед фиксацией реализации, чем более традиционный цикл редактирования / компиляции / запуска / тестирования. Для программиста это очень естественный способ выстроить понимание проблемы и напряженности дизайна в игре.
Модульное тестирование Код, написанный с использованием сторонних функций и неизменяемых структур данных, очень удобен для тестирования. Не существует сложных зависимых от времени взаимодействий, которые могли бы все испортить, или больших наборов зависимостей, которые нужно высмеивать.
Взаимодействие Я определил интерфейс для механизма вычислений в C # и реализовал вычисления в F #. Затем механизм вычислений может быть внедрен в любой модуль C #, который должен был его использовать, без каких-либо опасений по поводу совместимости. Бесшовные. Программист C # никогда не должен знать.
Сокращение кода Большая часть данных, поступающих в механизм расчета, была в форме векторов и матриц. Функции высшего порядка едят их на завтрак с минимальным суетой, минимальным кодом. Прекрасный.
Отсутствие ошибок. Функциональное программирование может показаться странным. Я могу работать над алгоритмом, изо всех сил пытаясь заставить код пройти проверку типов, но как только проверка типов будет удовлетворена, все будет работать. Он почти двоичный, либо не компилируется, ни корректен. Странные ошибки крайних случаев сведены к минимуму, функции рекурсии и более высокого порядка удаляют большой объем кода бухгалтерского учета, который вводит ошибки крайних случаев.
Параллелизм . Функциональная чистота результирующей реализации делает ее зрелой для использования присущего ей параллелизма при обработке векторов данных. Может быть, именно здесь я пойду дальше, когда выйдет .NET 4.