В каких областях использование F # может быть более подходящим, чем С#?

В течение последних нескольких лет F # превратилась в один из полностью поддерживаемых языков Microsoft, в котором использовалось множество идей, инкубированных в OCaml, ML и Haskell.

В течение последних нескольких лет С# расширила свои функции общего назначения, внедряя все больше функциональных функций языка: LINQ (понимание списка), Lambdas, Closures, анонимных делегатов и многое другое...

Учитывая использование С# этих функциональных возможностей и таксономии F # как нечистого функционального языка (он позволяет ВАМ обращаться к библиотекам фреймворков или изменять общее состояние при вызове функции, если вы хотите), существует сильное сходство между двумя языками, хотя каждый имеет свой собственный полярный противоположный основной акцент.

Я заинтересован в любых успешных моделях, использующих эти два языка в ваших программах полиглота, а также в областях программного обеспечения для производства (веб-приложения, клиентские приложения, серверные приложения), которые вы написали в F # в прошлом году, или чтобы вы ранее написали бы на С#.

Ответ 1

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

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

Единицы измерения Промышленность, в которой я работаю, усеяна единицами. Реализованные мной уравнения (часто геометрические) касались единиц времени, силы и энергии. Наличие системы типа проверки правильности единиц входов и выходов функций - это огромная экономия времени, как с точки зрения тестирования, так и с точки зрения чтения/понимания кода. Он уничтожает целый класс ошибок, которые были подвержены предыдущим системам.

Поисковое программирование Работа с файлами script и REPL (F # Interactive) позволили мне более эффективно исследовать пространство решения перед тем, как перейти к реализации, чем более традиционное редактирование/компиляция/запуск/тестирование петля. Это очень естественный способ для программиста понять свое понимание проблемы и напряженности дизайна в игре.

Тестирование модулей Код, написанный с использованием функций, не связанных с побочными эффектами, и неизменяемых структур данных - это радость для тестирования. Не существует сложных зависимых от времени взаимодействий, чтобы навязать вещи или большие наборы зависимостей, чтобы насмехаться.

Взаимодействие. Я определил интерфейс для механизма вычислений на С# и реализовал вычисление в F #. Механизм вычисления затем может быть введен в любой модуль С#, который должен был бы использовать его без каких-либо проблем в отношении интероперабельности. Бесшовные. Программисту С# никогда не нужно знать.

Сокращение кода Большая часть данных, подаваемых в вычислительный механизм, была в виде векторов и матриц. Функции более высокого порядка едят их на завтрак с минимальной суетой, минимальным кодом. Красивая.

Отсутствие ошибок Функциональное программирование может показаться странным. Я могу работать над алгоритмом, пытаясь заставить код пройти проверку типов, но как только проверка типов удовлетворена, то это работает. Его почти двоичный, либо он не будет компилироваться, либо его правильно. Ошибки случайных краев сводятся к минимуму, функции рекурсии и более высокого порядка удаляют много кода учета, что приводит к ошибкам краевого случая.

Parallelism Функциональная чистота результирующей реализации позволяет использовать встроенный parallelism в обработке векторов данных. Возможно, именно здесь я буду идти дальше, когда .NET 4 отсутствует.

Ответ 2

Во время моей стажировки в Microsoft Research я работал над некоторыми частями Visual Studio IntelliSense для F # (который сам написан на F #). У меня уже был некоторый опыт работы с IntelliSense из более ранних проектов С#, поэтому я думаю, что могу сравнить эти два.

  • Расширяемость Visual Studio по-прежнему основана на COM, поэтому вам нужно иметь дело с объектами, которые являются не очень хорошими объектами .NET(и определенно не являются функциональными), но я не чувствую, что существует большая разница между С# и F # (он работает плавно от F #)

  • Структуры данных, используемые для представления кода программы в F #, являются в основном дискриминационными объединениями (которые не поддерживаются на С# любым разумным способом), и это делает разницу огромной для такого типа приложений (где вам нужно обработать древовидные структуры, такие как программный код). Дискриминационные союзы и сопоставление шаблонов позволяют лучше структурировать код (сохраняйте связанную функциональность в одном месте, а не все это место в виртуальных методах).

Ранее я также работал над провайдером CodeDOM для F # (также написанным на F #). Я действительно сделал первые эксперименты на С#, но затем преобразовал код в F #.

  • Поставщику CodeDOM необходимо пройти через некоторую структуру, представленную с использованием объектов .NET, поэтому нет места для создания собственных представлений данных (это область, в которой F # может предложить хорошие преимущества).

  • Однако было много небольших функций F #, которые облегчили задачу. Поскольку вам нужно создать строку, я определил пользовательские операторы для построения строк (используя StringBuilder) и реализовал код, используя их, и функции более высокого порядка (например, для форматирования списка объектов, разделенных с использованием указанной строки и т.д.), Которые удалены много повторений (и утомительных циклов foreach).

Это два относительно конкретных примера, но оба они связаны с работой с представлениями программ или выражений или, более общо, сложными древовидными структурами данных. Я думаю, что в этой области F # определенно является хорошим выбором (независимо от функциональных возможностей на С#).

Ответ 3

Мы отправили первый коммерческий продукт в мире, записанный в F # (F # для визуализации), а второй (F # для Numerics), а также первую коммерческую литературу по F # (Журнал F #.NET) и написал и опубликовал единственную книгу о текущей версии F # (Visual F # 2010 для технических вычислений).

Мы отправляли продукты по аналогичным строкам, написанным на С# (например, это), но мы также имели сильный опыт коммерческого использования OCaml, Мы были в восторге от ранних усыновителей F #, когда он еще был прототипом исследования еще в 2006 году, потому что мы признали потенциал наличия приличного современного OCaml-подобного языка на платформе .NET для промышленной прочности и, следовательно, мы добились его продуктивности. Результат был невероятным успехом, и F # значительно превзошел наши высокие ожидания.

Для нас F # имеет много разных преимуществ, и мы используем его для самых разных приложений. У нас есть сотни тысяч строк кода F # в производстве. Теперь мы используем F # для всех наших приложений LOB: наши транзакции с кредитными картами обрабатываются с использованием кода F #, наши уведомления о продуктах отправляются с использованием кода F #, наши подписки обрабатываются с использованием кода F #, наши учетные записи выполняются с использованием кода F # и т.д. Возможно, основной особенностью языка, выплачивающей дивиденды, является сопоставление шаблонов. Мы даже использовали синтаксис F # для цветной подсветки нашей последней книги...

Наша библиотека визуализации является крупным продавцом, а ее функциональные центры сосредоточены на интерактивном запуске F # в Visual Studio. Наша библиотека дополняет это тем, что позволяет создавать интерактивные 2D и 3D визуализации с минимальными усилиями (например, просто Plot([Function sin], (-6., 6.)) для построения синусоидальной волны). В частности, все проблемы с потоками полностью автоматизированы, поэтому пользователям не нужно беспокоиться о потоках пользовательского интерфейса и отправке. Первоначальные функции и лень были чрезвычайно полезны при написании этой части библиотеки, а алгебраические типы данных широко использовались в других местах. Предсказуемая производительность также оказалась ценной здесь, когда наши клиенты столкнулись с ошибками производительности в тестовых тестах WPF и легко смогли переопределить соответствующий код в F # для улучшения производительности в 10 000 ×. Из-за свободной формы GUI этого продукта, GUI-дизайнер и С# не были бы полезны.

Большая часть нашей работы связана с численными методами, включая как наши коммерческие библиотеки, так и книги. F # намного сильнее в этой области, чем С#, потому что он предлагает абстракции высокого уровня (например, функции более высокого порядка) с минимальными штрафными санкциями. Наш наиболее убедительный результат в этом контексте заключался в создании простой, но обобщенной реализации QR-декомпозиции из линейной алгебры, которая была на 20 × короче, чем код Fortran из эталонной реализации LAPACK, до 3 × быстрее, чем настроенная Intel Intel Math Ядерная библиотека и более общий, потому что наш код может обрабатывать матрицы любого типа, даже символические матрицы!

В настоящее время мы разрабатываем компоненты WPF/Silverlight в сочетании F # (для кишок) и С# (для прокладки), создаем приложения WPF для интерактивных руководств для наших программных продуктов, и я пишу новую книгу Multicore F #, это будет окончательное руководство по параллельному программированию с разделяемой памятью на .NET.

Ответ 4

В течение последних 6 или около того месяцев я работал над уровнем эмуляции Vim для Visual Studio 2010. Это бесплатный продукт со всем источником, который он свободно доступен на github

Проект делится на 3 библиотеки DLL, представляющих отдельный слой. Каждый слой имеет соответствующую unit test dll.

  • Двигатель Vim: F #
  • Уровень WPF для украшений и интеграции редактора: С#
  • Уровень интеграции Visual Studio: С#

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

То, что я нахожу самым изумительным в F #, - это то, насколько он лаконичен. Двигатель Vim содержит основную часть логики, но он содержит только 30% общей базы кода.

Ответ 5

Многие модульные тесты для компонентов F # Visual Studio записываются в F #. Они выходят за пределы VS, высмеивая различные биты Visual Studio. Возможность сокрытия анонимных объектов, реализующих интерфейсы, полезна вместо насмешливой рамки/инструмента. Я могу просто написать

let owpe : string list ref = ref []
let vsOutputWindowPane = 
    { new IVsOutputWindowPane with
        member this.Activate () = err(__LINE__)
        member this.Clear () = owpe := []; 0
        member this.FlushToTaskList () = VSConstants.S_OK
        member this.GetName(pbstrPaneName) = err(__LINE__)
        member this.Hide () = err(__LINE__)
        member this.OutputString(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
        member this.OutputStringThreadSafe(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
        member this.OutputTaskItemString(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText) = err(__LINE__)
        member this.OutputTaskItemStringEx(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText, pszLookupKwd) = err(__LINE__)
        member this.SetName(pszPaneName) = err(__LINE__)
    }            
DoSomethingThatNeedsA(vsOutputWindowPane)
assert( !owpe = expectedOutputStringList )

когда мне нужен экземпляр, например. a IVsOutputWindowPane перейти к другому компоненту, который в конечном итоге будет вызывать OutputString и Clear, а затем проверить объект string list ref в конце теста, чтобы узнать, был ли написан ожидаемый вывод.

Ответ 6

Мы написали язык движков настраиваемых правил, используя реализацию Lex-Yacc в F #

РЕДАКТИРОВАТЬ, чтобы включить комментарий комментария

В С# не было реализации lex/yacc. (насколько нам известно, и F # один был)

Было бы возможно, но просто больно было бы разобраться в себе.

В этом разделе приведены некоторые другие предложения, такие как внешние библиотеки, но наш ведущий архитектор является старой рукой на функциональных языках, поэтому выбор использовать F # был -brainer.

Ответ 7

Не личный опыт, но вы можете прослушать эпизод DNR (я думаю, что этот), где они разговаривают с людьми Microsoft F #. Они написали большую часть системы подсчета очков Xbox Live, которая была далека от тривиальной, используя F #. Система масштабировалась массивно на сотни машин, и они были очень довольны им.

Ответ 10

В настоящее время я работаю над компиляцией для языка программирования. Компилятор написан полностью в F #. Компилятор (помимо сборки lex и parser с lex/yacc) в основном строится как много преобразований сложной структуры дерева.

Как отмечают другие, различия между объединениями и сопоставлением шаблонов делают работу с такой структурой данных намного проще, чем сброс кода в виртуальных методах "повсюду"

Я не выполнял никакой работы F # до того, как начал работать над компилятором (у меня все же были компиляторы bulg в другом варианте OCaml под названием MoscowML), и так же, как Джаред утверждает, что из кода видно, какие части я делал сначала, но в целом я обнаружил, что F # легко узнать, как попасть в умение FP снова после кодирования, в основном, OO в течение десятилетия займет немного больше времени.

работа с деревьями в стороне. Я нахожу способность писать декларативный код основным преимуществом FP ​​(включен F #) с кодом, который описывает алгоритм Im, пытающийся реализовать в отличие от С#, описывающий, как я реализовал algortihm, является огромным преимуществом.

Ответ 11

Я не знаю, было ли это в производстве, но AI для "Пути пути" написано в F #:

http://research.microsoft.com/en-us/events/techvista2010/demolist.aspx#ThePathofGo

Путь к успеху: исследование Microsoft Игра для Xbox 360

Эта демонстрация демонстрирует игру Xbox 360, основанный на игре Go, произведенный на дому в Microsoft Research Кембридж. Go является одним из самых знаменитые настольные игры в Восточной Азии, это возникла в Китае 4000 лет назад. За обманчивой простотой игра скрывает большую сложность. Это только требуется несколько минут, чтобы узнать, но требуется срок службы. Хотя компьютеры превзошли человеческие навыки в шахматах, внедрение конкурентного ИИ для Go остается задачей исследования. Игра оснащена тремя технологиями разработано в Microsoft Research Кембридж: ИИ, способный играть Go, язык F # и TrueSkill ™, чтобы матч онлайн-игроков. ИИ реализован в F # и соответствует задача эффективного функционирования в .net compact framework на Xbox 360. Эта игра помещает вас в ряд визуально ошеломляющих 3D-сцен. это было полностью разработан в управляемом коде, используя среда XNA.

(Кто-то еще упомянул "TrueSkill" уже.)