В каких областях использование F# может быть более уместным, чем C#? [закрытый]


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

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

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

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

11 201
c# f#

11 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Двигатель Vim: F#
  2. слой WPF для интеграции украшений и редактора: C#
  3. уровень интеграции Visual Studio: C#

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

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

многие модульные тесты для компонентов 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 )

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

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

изменить, чтобы включить комментарий ответ

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

Это было бы возможно, но прямо-таки больно строить разбор самим.

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

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

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

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

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

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

The WebSharper люди создали целый продукт, который сосредоточен на F# для веб-программирования. Вот статья, которая говорит об этом:

http://www.sdtimes.com/content/article.aspx?ArticleID=34075

вот пример исследования о банке, который использует F# вместе с C++ / COM для вещей:

http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000006794

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

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

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

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

(кто-то уже упоминал "TrueSkill".)