Многие из других ответов были сосредоточены на стороне функционального программирования (параллелизма), которая, как я считаю, очень важна. Тем не менее, вы специально задавали вопрос о производительности, как и в, можете ли вы программировать то же самое быстрее в функциональной парадигме, чем в императивной парадигме.
Я действительно нахожу (из личного опыта), что программирование в F # соответствует тому, как я думаю, лучше, и так проще. Я думаю, что это самая большая разница. Я запрограммировал как F #, так и C#, и есть намного меньше «борьбы с языком» в F #, который я люблю. Вам не нужно думать о деталях в F #. Вот несколько примеров того, что я нашел, мне действительно нравится.
Например, даже если F # статически типизирован (все типы разрешены во время компиляции), вывод типа определяет, какие типы у вас есть, поэтому вам не нужно это говорить. И если он не может понять это, он автоматически делает вашу функцию/класс/всеобще. Поэтому вам никогда не приходится писать какие-либо общие данные, все это автоматически. Я считаю, что это означает, что я больше трачу время на размышления о проблеме и меньше того, как ее реализовать. На самом деле, всякий раз, когда я возвращаюсь на C#, я нахожу, что мне очень не хватает такого вывода, вы никогда не понимаете, как отвлекать его, пока вам не нужно это делать больше.
Также в F # вместо написания циклов вы вызываете функции. Это тонкое изменение, но значимое, потому что вам больше не нужно думать о конструкции цикла. Например, вот кусок кода, который будет проходить и матч что-то (я не могу вспомнить, что, это от проекта Эйлера головоломки):
let matchingFactors =
factors
|> Seq.filter (fun x -> largestPalindrome % x = 0)
|> Seq.map (fun x -> (x, largestPalindrome/x))
Я понимаю, что делает фильтр затем карту (это преобразование каждого элемента) в C# было бы довольно простым, но вы должны думать на более низком уровне. В частности, вам нужно написать сам цикл и иметь свой собственный явный оператор if и такие вещи. Начиная с обучения F #, я понял, что мне было проще кодировать функциональным способом, где, если вы хотите фильтровать, вы пишете «фильтр», и если вы хотите отобразить карту, вы пишете «карту», вместо того чтобы внедрять каждая из деталей.
Мне также нравится оператор |>, который, я думаю, отделяет F # от ocaml и, возможно, других функциональных языков. Это оператор трубы, он позволяет вам «вывести» выход одного выражения во вход другого выражения. Это заставляет код следовать, как я думаю больше. Как и в фрагменте кода выше, это говорит: «Возьмите последовательность факторов, отфильтруйте их, а затем нарисуйте». Это очень высокий уровень мышления, который вы не получаете на императивном языке программирования, потому что вы так заняты написанием циклов и операторов if. Это единственное, что я пропускаю, когда я перехожу на другой язык.
Так что, вообще говоря, хотя я могу программировать как на C#, так и на F #, мне легче использовать F #, потому что вы можете думать на более высоком уровне. Я бы сказал, что, поскольку меньшие детали удаляются из функционального программирования (по крайней мере, по F #), я более продуктивен.
Редактировать: Я видел в одном из комментариев, что вы попросили пример «состояния» на функциональном языке программирования.F # можно записать императивно, так вот прямой пример того, как вы можете иметь изменяемое состояние в F #:
let mutable x = 5
for i in 1..10 do
x <- x + i
Красиво сказано и в точку! –
Я второй это! Я считаю, что функциональное программирование будет использоваться гораздо шире в будущем из-за его пригодности для параллельного программирования. –
@Ray: Я бы также добавил распределенное программирование! –