F Sharp: відмінності між версіями

[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
уточнення
Немає опису редагування
Рядок 28:
===== F# функціональна =====
 
F#, будучи спадкоємцем традицій сімейства мов ML, надає повний набір інструментів функціонального програмування: тут є [[Алгебричний тип даних|алгебраїчні типи даних]] і функції вищого порядку, можливість композиції функцій і незмінні структури даних, а також часткове застосування на пару з [[каррування]]м. Зі слів експертів в OCaml, в F# не вистачає функторів.
 
Усі функціональні можливості F # реалізовані в кінцевому підсумку поверх загальної системи типів. NET Framework. Однак цей факт не забезпечує зручності використання таких конструкцій з інших мов платформи. При розробці власних бібліотек на F # слід передбачити створення об'єктно-орієнтованих обгорток, які буде простіше використовувати з C# або Visual Basic. NET.
Рядок 87:
{{текст|1=open System.IO open System.Net open Microsoft.FSharp.Control.WebExtensions let getPage (url: string) = async {let req = WebRequest.Create (url) let! res = req.AsyncGetResponse () use stream = res.GetResponseStream () use reader = new StreamReader (stream) let! result = reader.AsyncReadToEnd () return result}}}
 
Тут ми оголосили функцію getPage, яка повинна повертати вміст сторінки за заданою адресою. Ця функція має тип <nowiki>string--> Async <string></nowiki> і повертає асинхронну операцію, яка може бути використана для отримання рядка з вмістом сторінки. Варто відзначити, що класи WebRequest і StreamReader не мають методів AsyncGetResponse і AsyncReadToEnd, це методи розширення.
 
Будівник асинхронного потоку операцій, працює таким чином. Зустрівши оператор let! або do!, він починає виконувати операцію асинхронно, при цьому метод, початківець асинхронну операцію, отримає частину, що залишилася блоку async як функція зворотного виклику. Після завершення асинхронної операції переданий callback продовжить виконання асинхронного потоку операцій, але, можливо, вже в іншому потоці операційної системи (для виконання коду використовується пул потоків). У результаті код виглядає так, як ніби він виконується послідовно. Те, що може бути з легкістю записано всередині блоку async з використанням циклів і умовних операторів, досить складно реалізується з використанням звичайної техніки, що вимагає опису множини callback-методів і передачею стану між їх викликами.
Рядок 139:
{{текст|1=let solarSystem = sun - (rotate 80.00f 4.1f mercury) - (rotate 150.0f 1.6f venus) - (rotate 215.0f 1.0f (earth - (rotate 20.0f 12.0f moon)))}}
 
Наступним прикладом використання F# є комерційний продукт WebSharper фірми IntelliFactory [2]. Це платформа для створення клієнтських web-додатків. Вона дозволяє писати клієнтський код на F#, який потім буде відтранслювати на JavaScript. Така трансляція поширюється на достатню велику підмножину F #, включаючи функціональне ядро мови, алгебраїчніалгебричні типи даних, класи, об'єкти, винятки й делегати. Також підтримується значна частина стандартної бібліотеки F #, включаючи роботу з послідовностями (sequences), подіями і асинхронними обчислювальними виразами (async workflows). Все може бути автоматично відтранслювати на цільову мову JavaScript. Крім того, підтримується деяка частина стандартних класів самого. NET, і обсяг підтримки буде зростати.
 
Цей продукт примітний тим, що тут використовується цілий ряд прийомів, характерних для функціонального програмування. Так, в WebSharper вбудований DSL для завдання HTML-коду, в якому широко застосовуються комбінатори.