Поделиться через


Пошаговое руководство. Создание первой программы на F#

Visual Studio 2010 включает новый язык программирования — F #. F# — это мультипарадигмальный язык, поддерживающий функциональное программирование в дополнение к традиционному объектно-ориентированному программированию и концепциям платформы .NET. В следующих примерах представлены некоторые его возможности и синтаксис. В примерах демонстрируется объявление простых переменных, написание и тестирование функций, создание кортежей и списков, а также определение и использования класса.

Примечание

На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Создание нового консольного приложения

  1. В меню Файл последовательно выберите пункты Создать и Проект.

  2. Если Visual F# не отображается в области Категории шаблонов, щелкните Другие языки и выберите Visual F#. В центре области Шаблоны отобразится список шаблонов F#.

  3. Обратите внимание на верхнюю часть области Шаблоны, чтобы убедиться, что в поле Целевая рабочая среда отображается значение .NET Framework 4.

  4. В списке шаблонов выберите шаблон Приложение F#.

  5. Введите имя проекта в поле Имя.

  6. Нажмите кнопку ОК.

    В обозревателе решений появится новый проект.

Использование ключевого слова let для объявления и использования идентификаторов

  • Скопируйте и вставьте следующий код в Program.fs. Привязка значения к идентификаторам anInt, aString и anIntSquared.

    let anInt = 5
    let aString = "Hello"
    // Perform a simple calculation and bind anIntSquared to the result.
    let anIntSquared = anInt * anInt
    

    Примечание

    Если в классическом виде код не отображается, убедитесь, что Фильтр по языкам в заголовке под названием раздела не исключает язык F#.

Просмотр результатов в окне F# Interactive

  1. Выберите выражения let в предыдущей процедуре.

  2. Щелкните правой кнопкой мыши на выбранной области и выберитеОтправить в Interactive. Либо нажмите сочетание клавиш ALT+ВВОД.

  3. В окне F# Interactive открываются и отображаются результаты интерпретации выражений let, как показано в следующих строках. Типы выводятся из указанных значений.

    val anInt : int = 5

    val aString : string = "Hello"

    val anIntSquared : int = 25

Просмотр результатов в окне командной строки

  1. Добавьте следующие строки к Program.fs.

    System.Console.WriteLine(anInt)
    System.Console.WriteLine(aString)
    System.Console.WriteLine(anIntSquared)
    
  2. Нажмите сочетание клавиш CTRL+F5 для запуска кода. Появится окно командной строки, содержащее следующие значения.

    5

    Hello

    25

    Можно проверить выводимые типы, подведя указатель мыши к именам идентификаторов anInt, aStringи anIntSquared в предыдущих операторах WriteLine.

Определение и запуск функции

  1. Используйте выражение let для определения функции возведения в квадрат, как показано в следующем коде. У функции имеется один параметр n и она возвращает квадрат аргумента, отправленного в n.

    let square n = n * n
    // Call the function to calculate the square of anInt, which has the value 5.
    let result = square anInt
    // Display the result.
    System.Console.WriteLine(result)
    
  2. Нажмите сочетание клавиш CTRL+F5 для запуска кода. Отображаемый результат — 25.

  3. Для рекурсивной функции требуется выражение let rec. В следующем примере определяется функция, которая вычисляет факториал параметра n.

    let rec factorial n = 
        if n = 0 
        then 1 
        else n * factorial (n - 1)
    System.Console.WriteLine(factorial anInt)
    
  4. Нажмите сочетание клавиш CTRL+F5 для запуска функции. Отображаемый результат — 120, факториал 5.

Создание коллекций (списков и кортежей)

  1. Одним из способов объединения значений является использование кортежа, как показано в следующем коде.

    let turnChoices = ("right", "left")
    System.Console.WriteLine(turnChoices)
    // Output: (right, left)
    
    let intAndSquare = (anInt, square anInt)
    System.Console.WriteLine(intAndSquare)
    // Output: (5,25)
    
  2. Другой способ объединения значений — использование списка, как показано в следующем коде.

    // List of best friends.
    let bffs = [ "Susan"; "Kerry"; "Linda"; "Maria" ] 
    

    Добавление нового лучшего друга в список с помощью оператора "cons" (::). Обратите внимание, что операция не изменяет значение bffs. Значение bffs является неизменяемым, поэтому его нельзя изменить.

    // Bind newBffs to a new list that has "Katie" as its first element.
    let newBffs = "Katie" :: bffs
    

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

    printfn "%A" bffs
    // Output: ["Susan"; "Kerry"; "Linda"; "Maria"]
    printfn "%A" newBffs
    // Output: ["Katie"; "Susan"; "Kerry"; "Linda"; "Maria"]
    
  3. Результаты можно просмотреть с помощью нажатия сочетания клавиш CTRL+F5 или путем выбора раздела кода и последующего нажатия сочетания клавиш ALT+ВВОД.

Создание и использование класса

  1. В следующем коде создается класс Person с двумя свойствами Name и Age. Свойство Name доступно только для чтения. Его значение является неизменяемым, как и большинство значений в функциональном программировании. В F# можно создавать изменяемые значения, если они требуются, однако их необходимо определять явным образом. В следующем определении класса значение Age хранится в изменяемой локальной переменной internalAge. Значение internalAge можно изменить.

    // The declaration creates a constructor that takes two values, name and age.
    type Person(name:string, age:int) =
        // A Person object's age can be changed. The mutable keyword in the
        // declaration makes that possible.
        let mutable internalAge = age
    
        // Declare a second constructor that takes only one argument, a name.
        // This constructor calls the constructor that requires two arguments,
        // sending 0 as the value for age.
        new(name:string) = Person(name, 0)
    
        // A read-only property.
        member this.Name = name
        // A read/write property.
        member this.Age
            with get() = internalAge
            and set(value) = internalAge <- value
    
        // Instance methods.
        // Increment the person's age.
        member this.HasABirthday () = internalAge <- internalAge + 1
    
        // Check current age against some threshold.
        member this.IsOfAge targetAge = internalAge >= targetAge
    
        // Display the person's name and age.
        override this.ToString () = 
            "Name:  " + name + "\n" + "Age:   " + (string)internalAge
    
    
  2. Чтобы протестировать класс, объявите два объекта Person, внесите изменения и отобразите результаты, как показано в следующем коде.

    // The following let expressions are not part of the Person class. Make sure
    // they begin at the left margin.
    let person1 = Person("John", 43)
    let person2 = Person("Mary")
    
    // Send a new value for Mary's mutable property, Age.
    person2.Age <- 15
    // Add a year to John's age.
    person1.HasABirthday()
    
    // Display results.
    System.Console.WriteLine(person1.ToString())
    System.Console.WriteLine(person2.ToString())
    // Is Mary old enough to vote?
    System.Console.WriteLine(person2.IsOfAge(18))
    

    Отобразятся следующие строки.

    Name: John

    Age: 44

    Name: Mary

    Age: 15

    False

Просмотр других примеров учебника по F#

  1. В меню Файл последовательно выберите пункты Создать и Проект.

  2. Если Visual F# не отображается в области Категории шаблонов, щелкните Другие языки и выберите Visual F#. В центре области Шаблоны отобразится список шаблонов F#.

  3. Обратите внимание на верхнюю часть области Шаблоны, чтобы убедиться, что в поле Целевая рабочая среда отображается значение .NET Framework 4.

  4. В списке шаблонов выберите шаблон Учебник по F#.

  5. Нажмите кнопку ОК.

  6. Учебник откроется в обозревателе решений.

Следующие действия

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

См. также

Основные понятия

Новые возможности Visual F# 2010

Функции как значения первого класса (F#)

Другие ресурсы

Visual F#

Справочник по языку F#