Пошаговое руководство. Создание первой программы на F#
Visual Studio 2010 включает новый язык программирования — F #. F# — это мультипарадигмальный язык, поддерживающий функциональное программирование в дополнение к традиционному объектно-ориентированному программированию и концепциям платформы .NET. В следующих примерах представлены некоторые его возможности и синтаксис. В примерах демонстрируется объявление простых переменных, написание и тестирование функций, создание кортежей и списков, а также определение и использования класса.
Примечание
На вашем компьютере названия некоторых элементов интерфейса пользователя Visual Studio или их расположение могут отличаться от указанных в нижеследующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.
Создание нового консольного приложения
В меню Файл последовательно выберите пункты Создать и Проект.
Если Visual F# не отображается в области Категории шаблонов, щелкните Другие языки и выберите Visual F#. В центре области Шаблоны отобразится список шаблонов F#.
Обратите внимание на верхнюю часть области Шаблоны, чтобы убедиться, что в поле Целевая рабочая среда отображается значение .NET Framework 4.
В списке шаблонов выберите шаблон Приложение F#.
Введите имя проекта в поле Имя.
Нажмите кнопку ОК.
В обозревателе решений появится новый проект.
Использование ключевого слова 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
Выберите выражения let в предыдущей процедуре.
Щелкните правой кнопкой мыши на выбранной области и выберитеОтправить в Interactive. Либо нажмите сочетание клавиш ALT+ВВОД.
В окне F# Interactive открываются и отображаются результаты интерпретации выражений let, как показано в следующих строках. Типы выводятся из указанных значений.
val anInt : int = 5
val aString : string = "Hello"
val anIntSquared : int = 25
Просмотр результатов в окне командной строки
Добавьте следующие строки к Program.fs.
System.Console.WriteLine(anInt) System.Console.WriteLine(aString) System.Console.WriteLine(anIntSquared)
Нажмите сочетание клавиш CTRL+F5 для запуска кода. Появится окно командной строки, содержащее следующие значения.
5
Hello
25
Можно проверить выводимые типы, подведя указатель мыши к именам идентификаторов anInt, aStringи anIntSquared в предыдущих операторах WriteLine.
Определение и запуск функции
Используйте выражение 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)
Нажмите сочетание клавиш CTRL+F5 для запуска кода. Отображаемый результат — 25.
Для рекурсивной функции требуется выражение let rec. В следующем примере определяется функция, которая вычисляет факториал параметра n.
let rec factorial n = if n = 0 then 1 else n * factorial (n - 1) System.Console.WriteLine(factorial anInt)
Нажмите сочетание клавиш CTRL+F5 для запуска функции. Отображаемый результат — 120, факториал 5.
Создание коллекций (списков и кортежей)
Одним из способов объединения значений является использование кортежа, как показано в следующем коде.
let turnChoices = ("right", "left") System.Console.WriteLine(turnChoices) // Output: (right, left) let intAndSquare = (anInt, square anInt) System.Console.WriteLine(intAndSquare) // Output: (5,25)
Другой способ объединения значений — использование списка, как показано в следующем коде.
// 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"]
Результаты можно просмотреть с помощью нажатия сочетания клавиш CTRL+F5 или путем выбора раздела кода и последующего нажатия сочетания клавиш ALT+ВВОД.
Создание и использование класса
В следующем коде создается класс 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
Чтобы протестировать класс, объявите два объекта 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#
В меню Файл последовательно выберите пункты Создать и Проект.
Если Visual F# не отображается в области Категории шаблонов, щелкните Другие языки и выберите Visual F#. В центре области Шаблоны отобразится список шаблонов F#.
Обратите внимание на верхнюю часть области Шаблоны, чтобы убедиться, что в поле Целевая рабочая среда отображается значение .NET Framework 4.
В списке шаблонов выберите шаблон Учебник по F#.
Нажмите кнопку ОК.
Учебник откроется в обозревателе решений.
Следующие действия
Дополнительные сведения о функциональном программировании и дополнительные примеры см. в разделе Функции как значения первого класса (F#). Дополнительные сведения о кортежах, списках, выражениях let, определениях функций, классах, членах и о многих других темах см. в разделе Справочник по языку F#.
См. также
Основные понятия
Новые возможности Visual F# 2010
Функции как значения первого класса (F#)