Пользователь
0,0
рейтинг
26 декабря 2008 в 01:45

Разработка → F#: Hello, World!

.NET*
Приблизительно через год нас ждет очередной релиз 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# на протяжении ближайшего года.
Если будет интерес к данной теме — попробую сочинить еще что-нибудь, по крайней мере мне эта область очень интересна.
Виктор @mace
карма
204,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (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'ов ;)
        • +2
          из всех фич F# меня потрясла работа с единицами измерения… это сильно, имхо.
        • 0
          То есть на первоначальную идею «а теперь мы бесплатно перенесем кучу готового кода» в итоге забили?
  • –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
          ну и что?
          написано же в первой строчке абзаца он еще через год только выйдет. к тому времени можт и для моно чтонибуть наклепают.
  • НЛО прилетело и опубликовало эту надпись здесь
    • НЛО прилетело и опубликовало эту надпись здесь

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