F#: Hello, World!

    Приблизительно через год нас ждет очередной релиз Microsoft Visual Studio и едва ли не самой вкусной новинкой обещает стать F# — функциональный язык глазами ребят из Кембриджской лаборатории Microsoft Research. Этот язык совсем новый и сейчас находится на стадии вылизывания в лабораториях Microsoft Research. Microsoft позиционирует F# как один из основных языков для .Net наряду с C# и VB.Net что скорее всего значит, что рано или поздно с ним придется столкнутся очень многим програмистам под .Net. Я, как и многие разработчики, никогда не сталкивался с чисто функциональными языками, но принцип «Готовь сани летом» еще не отменяли. Эта статья — мой личный маленький «Привет F#».

    Итак, пощупать новинку можно уже сейчас. Для этого нам понадобится Visual Studio 2008 и Microsoft F#, September 2008 Community Technology Preview. После установки последнего в студии появится новая ветка проектов — Visual F#.
    Создадим консольное приложение и после некоторого времени, затраченного на гугление, попробуем поздороватся с миром:
    // подключаем лайт-синтаксис<br/>
    #light<br/>

    // C# : using System;<br/>
    open System<br/>

    // скажем миру привет<br/>
    printfn "Hello, World! What is your name, user?"<br/>

    // а как нас зовут? C# : var name = Console.ReadLine();<br/>
    let name = Console.ReadLine()<br/>

    // определим функцию, которая будет говорить "привет" аргументу who.<br/>
    // приблизительный аналог на C#:<br/>
    // public delegate void SaySomethingDelegate(string toWho); <br/>
    // SaySomethingDelegate sayHello = who => Console.WriteLine("Hello, {0}!", who);<br/>
    let sayHello who = printfn "Hello, %s!" who<br/>

    // привет, Хабрахабр!<br/>
    sayHello name<br/>

    // а в функциях можно использовать и стандартные методы .Net Framework:<br/>
    let sayHelloDotNet who = Console.WriteLine("Hello from F# via .Net, " + name + "!")<br/>

    // и опять привет!<br/>
    sayHelloDotNet name<br/>

    // в качестве бонуса посчитаем числа Фибоначчи :)<br/>
    let rec fib i =         // рекурсивная функция от одного аргумента<br/>
      match i with        // которая смотрит на что похож этот аргумент<br/>
      | 1 | 2 -> 1        // если он 1 или 2, то возвращаем 1<br/>
      | i -> fib(i-1) + fib(i-2) // если он похож только на себя - то рекурсивно вызываем эту же функцию<br/>
      
    // смотрим, что у нас получилось<br/>
    printfn "%i" (fib 20)<br/>

    * This source code was highlighted with Source Code Highlighter.

    Output нашей программы:
    Hello, World! What is your name, user?
    Habrahabr
    Hello, Habrahabr!
    Hello from F# via .Net, Habrahabr!
    6765

    Вот так. Язык довольно приятен. Да, ФП — это принципиально другая область чем традиционные языки типа C#. Да, F# еще сыроват. Да, не хватает много фич. Да, есть Nemerle, но вряд ли MS будут кардинально менять F# на протяжении ближайшего года.
    Если будет интерес к данной теме — попробую сочинить еще что-нибудь, по крайней мере мне эта область очень интересна.
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 77
    • +19
      Не вижу особого смысла в данной статье, ибо из нее совершенно непонятно, зачем язык создавался и какие у него будут ключевые особенности.

      Если честно, видеть эталонный рекурсивный процесс вычисления чисел фибоначчи не очень интересно.
      • 0
        Эта статья — ни в коем случае не обзор. Это Hello World, который говорит читателю «Есть вот такой язык». Фибоначчи — классический пример алгоритма, который как нельзя легко решается на этом языке и собственно дает понять, что основная цель языка — именно математические расчеты.
        • 0
          За такого Фибоначчи вам бы пару влепили в MIT (судя по SICP).
          • 0
            Конечно влепили — количество вызовов рекурсии зависит экспотенциально от её глубины, надо бы там концевую рекурсию…
            • 0
              Если вы о мемоизации, то я о ней прекрасно знаю. Пример на то и пример, чтоб не перегружать его деталями.
          • +2
            В следующей статье попробую более глубоко рассказать, что такое F# и для чего он нужен.
            • +1
              В книжке по ОКамлу (practical ocaml) (который предок F#) демонстрация рекурсии тоже по числам Фибоначчи, но сразу же идёт абзац (вольно) «Числа Фибоначчи конечно хорошо, но когда у вас в последний раз была необходимость их вычислять?» и тут же приводится пример реально полезной рекурсии сразу с примером на «хвостатость» — разбиение строки на символы и склейка списка символов в строку.

              Я целиком и полностью согласен с таким подходом — надо демонстрировать мощь языка именно на тех примерах которые как-то близки к реальной жизни.
              • +1
                Обязательно учту в следующей статье — уже есть задумка с примером из реальной жизни.
              • –2
                Все функциональные языки — по сути дела, DSL-и для вычисления чисел Фибоначчи, всё остальное — примочки, свистелки и синтактик шугар. Если не верите — возьмите совершенно любой туториал, книгу, статью по функциональному языку — всё прочее необязательно, но числа Фибоначчи будут там всегда! :)
                • +1
                  Все ЯП, по вашей логике, придуманные человечеством предназначены для вывода сообщения «Hello, world!», а всё остальное синтаксический сахар и свистелки. :)
                  • +1
                    Поэтому лучшим языком является HQ9+ :-)
                    • 0
                      Чорт, уели!.. :)
                • +3
                  Мне лично интересен был бы обзор отличий F# от Haskell и OCaml (кроме очевидного — .Net), дабы знать, чего можно лишиться, а чего приобрести.
                  • 0
                    Приобрести — возможность переиспользования любого кода .NET, потерять — красоту языка. Говорю о сравнении с Haskell, на OCaml не писал ничего.
                    • 0
                      в общем, ЕМНИП, F# это фактически и есть O'Caml… «улучшенный и доработанный»
                      • +1
                        На самом деле там дофига всего поменялось. Изначально он был очень близок к окемлу, но щас уже далеко ушел в сторону (см. хотя бы active patterns ). Небольшая программа на общем подмножестве Ocaml и F#, которую я писал года два назад, щас уже компилируется на F# с сотней deprecation warning'ов ;)
                  • –7
                    Спасибо за статью. Приятно видеть F# на старницах Хабра. Будущее за этим языком (ИМХО)
                    • 0
                      мое субъективное имхо в том что F# будет иметь сложности с внедрением и массовостью хотя бы из-за того что его базовый синтаксис отличается от C-шного. Я давно заметил что большинство языков которые «не похожи» на С остаются привязанными к конкретным задачам
                      • –3
                        Народ не любит васико-подобность, и я к этому народу присоединяюсь, меньше слов (в коде) — больше дела.
                        • +1
                          В упор не пойму какой язык вы имели в виду, когда говорили про «васико-подобность»: C, C# или F#?
                          • 0
                            васик = basic :)
                            • 0
                              Это понятно. Не понятно какое отношение это имеет к сравнению C/C#/F#.
                              • –2
                                let, rec, match, with и прочее.
                                • +1
                                  Уверяю, что это внешнее сходство, мне не очень понятное. Может дело в том, что я немного знаком с OCaml, Haskell :). Кроме пары ключевых слов найти что-то общее между F# и Basic сложно. Кстати let, with активно используются и в других языках.
                                  • 0
                                    К сожалению о этих языках узнал буквально на днях. Я заметил общество опять начало их обсуждать. Следовательно не могу утверждать плохо ли это. Я просто приверженец С-подобного синтаксиса.
                        • +1
                          так можно делать проект на двух языках при необходимости. или даже на 10… C# + Boo — для меня отработанная связка :-)
                          • 0
                            Поддерживаю. .NET в этом отношении безусловно рулит. Но научные работники в большинстве своем предпочитают C-шный синтаксис. Прочие языки выполняют чисто утилитарную функцию — например IDL (interactive data language) c синтаксисом a-для Фортран.

                            Спору нет, есть огромное количество унаследованного кода со времен царя Гороха написанного на фортране (и еще более дремучих языках), что обеспечивает постоянный интерес к нему. Но в основном критические к производительности расчеты пишутся на C/C++.
                      • +5
                        надеюсь люди не кинутся переходить на F# не понимая зачем он нужен.
                        • +2
                          Я тоже надеюсь. Нужно понимать, что F# не замена C#. Это дополнение к нему, которое упрощает написание целого класса алгоритмов для математических расчетов.
                          • 0
                            Даже скорее не мат.расчетов, а создание парсеров. Например, texc написан на ocaml и используется в википедии.
                          • 0
                            да, вряд-ли кто-то вообще кинется ибо новый язык может привлечь либо специфическими фичами либо готовым набором высокоуровневых библиотек.
                            Фичи F# — функциональный стиль, однако C# в третей версии имеет уже очень много из функциональных ЯП.
                          • 0
                            Всем спасибо, перенес в .Net.
                            • –4
                              // а как нас зовут? C#: var name = Console.ReadLine();
                              Это больше на VB похоже чем на C#
                              • 0
                                В C# 3.0 можно написать точно так же — вывод типов, однако.
                                • 0
                                  это именно C# 3.0
                                  вот вам чуть посложнее: var urid = db.References.First(a => a.sName.StartsWith(«test»));
                                  • +1
                                    забыл строку одну var db = new Platform.Kernel.Database.PlatformDataContext();
                                • 0
                                  Вот доклад с Платформы на эту тему — platforma2009.ru/materials/showitem.aspx?MID=77110d82-f458-4231-a6ba-441b0dac6478
                                  • 0
                                    Неожиданно после повальной объектно-ориентированности со стороны Microsoft выпустить на рынок функциональный язык. Интересно было бы услишать где его можно применять на практика. Пока что это — новая игруша от MS.
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                      • 0
                                        ФП может быть и без ленивости.
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                          • 0
                                            Scheme, CL, Erlang, OCaml, SML, и т.д.
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                              • 0
                                                И в SML тоже есть (у SML/NJ есть расширение), и в Scheme есть, поэтому правильнее будет говорить о том, что в этих языках используется аппликативная форма вычисления по-умолчанию.
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • +1
                                                    Ленивость вообще не является неотъемлемой чертой ФЯ, по-умолчанию она есть только в хаскеле (и Clean). Связано больше с тем, что с ленивыми вычислениями часто производительность трудно предсказать «на глаз», ну и компилятор сложнее, да. Хотя на этот счет есть разные мнения.

                                                    На рсдн недавно большая ветка была на эту тему.
                                                    • 0
                                                      Да, наверное. Это надо публикации читать и имплементаторов спрашивать.
                                                      • 0
                                                        В Эриксоне решили, что в их сфере деятельности важнее сразу «на глаз» видеть из кода, какие именно будут выполнены действия и в какой именно последовательности, а не доверять эти решения компилятору. Ленивость и декларативность хороши в чистых вычислениях, а когда будущая программа заведомо будет вся с упором на побочные эффекты, то себе дороже выходит.
                                                        Это хорошо видно по тому, насколько параноидально компилятор Эрланга проверяет паттерны и условные выражения на чистоту.
                                          • +1
                                            «функциональный язык глазами ребят из Редмонда»
                                            язык разработан Microsoft Research в Кембридже
                                            • 0
                                              Спасибо, исправил.
                                            • 0
                                              Все таки не понятно зачем он нужен. Математические расчеты, парсинг… Приведите пример задачи, которую на том же C# сделать намного сложнее.
                                              • +1
                                                Да хоть бы не очень сложные физические расчеты blogs.msdn.com/andrewkennedy/archive/2008/08/20/units-of-measure-in-f-part-one-introducing-units.aspx
                                                • 0
                                                  А вот это интересно. Спасибо.
                                                  • 0
                                                    Поговаривают, что для C++ подобное умеет делать Boost.Units. Быть может, он не так лаконичен, как встроенная поддержка единиц измерения в F#, но разве это именно то, что сложно сделать на C*? :)
                                                    • 0
                                                      Дык это C++ а не C#, там темплейты есть.
                                                      • 0
                                                        В общем-то в C# есть дженерики, на которых такое тоже можно написать. В случае с F# единицы измерений как раз и разворачиваются в дженерики на уровне IIL. Другое дело, что для этого нужно много времени и кода либо же стороннюю библиотеку а-ля Буст. А в F# поддержка на уровне синтаксиса.
                                                        • +1
                                                          Йа не являюсь мегаспециалистом по C#, но дженерики это таки сильно другое, и бОльшую часть трюков на основе C++ темплейтов с дженериками повторить нельзя. И в случае с F#, кстати, похоже, единицы измерений на уровне CLR вообще никак не видны.
                                                          • 0
                                                            Да, вы правы. Специально полез рефлектором в ехе-шку, скомпиленную F#: все еденицы измерения — простые даблы, приведенные к системе SI.
                                                  • 0
                                                    Для уменьшения кол-ва кода, упрощения отладки, упрашенного распараллеливания и остальных прелестей ФП
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                    • –1
                                                      ну наконец то хоть появится нормальный язык программирования для .net
                                                      • 0
                                                        Какие компиляторы на данный момент понимают F#?
                                                        • 0
                                                          Собственно компилятор у F# один :) Он так и называется. Скачать последнюю актуальную версию вместе с компонентами для Visual Studio можно по ссылке: www.microsoft.com/downloads/details.aspx?FamilyID=61ad6924-93ad-48dc-8c67-60f7e7803d3c&displaylang=en
                                                          • 0
                                                            Supported Operating Systems: Windows Vista; Windows XP
                                                            И это единственный компилятор? :(
                                                            • +1
                                                              Не, там под моно тоже есть (но я лично не пробовал).
                                                              • 0
                                                                .Net языки компилируются в промежуточный код MS IIL, который работает везде, где есть .Net(или Mono, как его родной брат, впрочем немного ущербный). Сомневаюсь, что для моно нужен особый компилятор. Разве что в F# используются специфические фичи .Net 3.5, которые еще не добрались до Моно.
                                                                • 0
                                                                  Не, компилятор, понятно, тот же, но там как раз были раньше какие-то проблемы с моно из-за использования специфических новых фич CLR.
                                                                  • +1
                                                                    Насколько я знаю, .Net 3.5 использует CLR 2.0 — все новые фичи 3.5 на уровне компиляторов и библиотек.
                                                              • 0
                                                                Ну а что вы собственно ожидали от детища Майкрософт да еще на стадии бета-версии?
                                                                • 0
                                                                  ну и что?
                                                                  написано же в первой строчке абзаца он еще через год только выйдет. к тому времени можт и для моно чтонибуть наклепают.
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                              • НЛО прилетело и опубликовало эту надпись здесь

                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.