Вечер с F#

В последнее время часто стал интересоваться статьями о F#.

Здесь написанно о преимуществах языка применительно к академическим вычислениям, символьной алгебре. Здесь F# напоминает рекламу стирального порошка или зубной пасты. Побродив по прочим окресным ссылкам понял, что F# это круто, F# усиленно пиарят. Здесь скачал Microsoft Visual Studio 2010 Beta (устанавливается п-ц долго). Говорят, что есть уже Beta 2? Скачаю, может будет быстрее, а то тормозит. Ну и книгу с дятлом по F#. Программировать на F# можно и в текстовом редакторе типа блокнота. Программа а-ля Hello world

open System

let timeOfDay=DateTime.Now.ToString("hh : mm tt")

printfn "%s" timeOfDay

let name=Console.ReadLine()
if name="Kianush" then
    printfn "Hello senior F# programmer, %s" name
else
    printfn "Hello, %s" name

Console.ReadLine()

Можно набрать в блокноте, сохранить в например HelloWorld.fs и натравить компилятор F#

C:\Program Files\Microsoft F#\v4.0>fsc HelloWorld.fs

После выходных планирую попробовать установить компилятор F# без MSVS 2010,

Следует обратить внимание на пробелы, вот что написано в книге с дятлом по этому поводу:


In F# whitespace-spaces and newlines-is significant. The F# compiler allows you to use whitespace to delimit code blocks.

For example, anything indented more than the if keyword is considered to be in the body of the if statement

т.е. на смену блокам {} в С/С++ и begin ... end пришел более... Вот тут я запнулся. Конечно, отмечать блоки отступами — круто

но способ { } мне нравится не меньше, при таком форматировании кода видно начало и конец блока

посмотрим, может со временем мне с пробелами понравиться больше... А тем временем книга с дятлом рекомендует автоматическую замену символов табуляции пробелами. Правило таково, что тело метода или оператора должно быть сдвинуто на больше пробелов, чем число символов ключевого слова, с которого начинается метод или оператор. В оригинале:


the general rule is that anything belonging to a method or statement must be indented further that the keyword that began the method or statement

Но больше всего моих восторгов досталось F# Interactive

> open System.Drawing
open System.Windows.Forms;;
> let myForm = new Form(Text = "Hello, Kianush!", Visible = true);;

val myForm : Form = System.Windows.Forms.Form, Text: Hello, Kianush!

Я давно мечтал о такой фиче, теберь язык програамирования может быть компилируемо — скриптовым.

👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

дан список чисел, удалить из него все простые числа и вернуть в качестве рез-та то, что осталось.

И чем же отличается биндинг от присваивания в терминах функционального программирования? Ничем. Вычислить значение и записать в переменную. Какое время жизни у этого значения (extent) — дело десятое.

Там вместо let rec написано fun, т.е. fun = let rec. Я об это писал выше.


там же написано йопт:
x < — 10

иксу присвоилось десять. Я так понимаю ты говоришь о языке, который не знаешь, а только слышал название?

Ты уж определись со значением слова ПЕРЕМЕННАЯ, и долго думай чем binding (связывание) отличается от присваивания.

Ну выше уже ответили. Мне кажется что ты не совсем представляешь внутреннюю кухню.

Я, может быть, действительно что-то не представляю, но как объясните Вы этот кусочек:
fun fac (n) = if n = 0 then 1 else n * fac (n-1);

Почему там нет rec? Какой-то сбой во внутренней кухне?


Вот как раз в ML-е этого уродства не было.
fun fac (n) = if n = 0 then 1 else n * fac (n-1);
Ну выше уже ответили. Мне кажется что ты не совсем представляешь внутреннюю кухню.
Грубо говоря, ключевое слово let вычисляет то, что справа и биндит результат на то, что слева. Сначала _вычисляет и только _потом биндин. Это означает, что let, когда встретит внутри кода рекурсивной функции слово «fac», не поймёт что соответcтвует этому слову, т.е. на этом этапе не известно на что забиндено слово/метка «fac». Соответственно чтобы решить эту проблему с let, придумывают «особый let», в ф-шарпе это let rec (такое же есть в ML, судя по ссылке выше). «fun» в твоем примере играет ту же роль, что и let rec.

Возможно я не прав в своих рассуждениях, буду рад услышать объяснение в таком случае:)

Т.е. ты уверен, что создал переменную? Покажи мне как ты ей присвоишь новое значение.

там же написано йопт:
x < — 10

иксу присвоилось десять. Я так понимаю ты говоришь о языке, который не знаешь, а только слышал название?

Вот как раз в ML-е этого уродства не было.

Было и есть: www.cs.cmu.edu/...core/recfns.htm

Такое «поведение» F# унаследовал от цепочки OCaml< -Caml< -ML.

Вот как раз в ML-е этого уродства не было.

fun fac (n) = if n = 0 then 1 else n * fac (n-1);


Есть там переменные:
let mutable x = 5
x < — 10

Т.е. ты уверен, что создал переменную? Покажи мне как ты ей присвоишь новое значение.


Язык, в котором для объявления рекурсивной функции, требуется специальный синтаксис, лучше сразу закопать.

Такое «поведение» F# унаследовал от цепочки OCaml< -Caml< -ML. Вообще непонятно, почему тебе так не нравится rec.

А что ты хочешь от человека с ником «ВижуалБасик»?

Есть там переменные:

let mutable x = 5
x <- 10

А ты прикинь, там еще и для переменных специальный синтаксис!

Ты прикинь, но там нет переменных. Сюрприз да?

В общем, сложновато с непривычки, но выведение типов приводит меня в полный восторг:)

Представляю в какой восторг тебя приведет типизированное лямбда исчисление. Если осилишь.

2 VisualBasic
(Сорри, не удержался)
А ты прикинь, там еще и для переменных специальный синтаксис!
В общем, сложновато с непривычки, но выведение типов приводит меня в полный восторг:)

Только что почти написал на F# маленькое приложение «для себя». Вставляет в упорядоченый xml новую запись в нужное место. В итоге все равно в императивном стиле получилось.

2 VisualBasic
(Сорри, не удержался)
А ты прикинь, там еще и для переменных специальный синтаксис!
В общем, сложновато с непривычки, но выведение типов приводит меня в полный восторг:)

Только что почти написал на F# маленькое приложение «для себя». Вставляет в упорядоченый xml новую запись в нужное место. В итоге все равно в императивном стиле получилось.

пока не увидел работающий F#-код в продакшине одной серьезной системы.

Некоторые считают, что прирост превышает 400%, т.е. вместо пяти кодеров можно нанять одного.

Я не про теорию, а про практику. Просто, я на практике не сталкивался с большими проектами на функциональных языках, может по молодости.

Кроме того, программы в функциональном стиле легче параллелизуются, так как состояниям (общим переменным) предпочитаются цепочки вычислений.

Можете рассказать подробнее про реальные примеры в больших проектах, про удачное использование в небольших проектах (сделал/сдал/забыл) я знаю.

А можно, вкратце, что они выиграли от внедрения F#? Скорость, память, поддерживаемость,... (без сарказма)

Преимущество F# и функционального программирования вообще, в первую очередь, скорость разработки. Некоторые считают, что прирост превышает 400%, т.е. вместо пяти кодеров можно нанять одного. Кроме того, программы в функциональном стиле легче параллелизуются, так как состояниям (общим переменным) предпочитаются цепочки вычислений.

Сам не верил, что это кому-то надо, пока не увидел работающий F#-код в продакшине одной серьезной системы.

А можно, вкратце, что они выиграли от внедрения F#? Скорость, память, поддерживаемость,... (без сарказма)

Есть задачи, где использование F# (или другого функционального языка) предпочтительней. Сам не верил, что это кому-то надо, пока не увидел работающий F#-код в продакшине одной серьезной системы. Другой вопрос, что объяснять это аудитории ДОУ, которая состоят более чем полностью из «поклонников» MS, имхо, бесполезно.

hellip, а ты что скажешь, ты же им вроде увлекаешься?

Ага, забил. Вообще в последнее время все меньше времени

Язык, в котором для объявления рекурсивной функции, требуется специальный синтаксис, лучше сразу закопать.


Я давно мечтал о такой фиче, теберь язык програамирования может быть компилируемо — скриптовым

Common Lisp, не? Такой весь очень компилируемый, что и disassemble можно делать прямо из repl’а, и в то же время интерактивность и интраспекция на высоте.

жаждущим экстрима и познания новых задрючливых форм жизни сюда
kx.com/...oducts/kdb .php

www.cs.nyu.edu/.../Java_vs_K.html

Короч как я понял никто пока не знает каким боком и куда этот язык можно впихнуть)) Я тоже пока не придумал (хотя есть один не скромный вариант:), продолжаю писать на C#, его возможностей мне пока выши крыши.


Следующая программа определяет размер директории

open System
open System.IO
let TimeStart=DateTime.Now.ToString("hh:mm:ss");

Console.WriteLine(@"Введите путь к каталогу, который Вас интересует, например C:\Program Files ")
let PathOfFolder=Console.ReadLine()
printfn "%s" TimeStart

let UnglySizeOfFolder folder=
    Array.sum
        (Array.map
            (fun (info : FileInfo) -> info.Length)
            (Array.map
                (fun file->new FileInfo(file))
                (Directory.GetFiles(
                    folder, ".",
                    SearchOption.AllDirectories))))
let Size =
    let SizeInBytes=UnglySizeOfFolder PathOfFolder
    let SizeInMegaBytes=SizeInBytes/(1024L*1024L)
    SizeInMegaBytes
let TimeEnd=DateTime.Now.ToString("hh:mm:ss");
printfn "%s" TimeEnd
printfn "%d Megabytes in %s" Size PathOfFolder
Console.ReadLine()

можете оценить время выполнения. Exe файл, исходники


А вас, аноним, очевидно просто злит, когда Майкрософт чего-нибудь новое делает, да?
Сразу видно что Вы не в теме. Для начала почитайте об ML, затем о Caml, затем об OCaml, и напоследок о F#. И что там нового?

P.S. Вы ещё скажите, что IronPython тоже нечто «новое» и революционное: -)

...зато совместимое с.NETом.

Хех.

Ага... И получится функциональное программирование от МСа несовместимое со всем остальным функциональным программированием.

Не ну серёзно, на фа диез «серёзные надежды», на продвижение функц парадигмы в «массы». Ибо «продвигаеться» не кемнибуть, а самим микрософтом.

2 denis.gz

А вас, аноним, очевидно просто злит, когда Майкрософт чего-нибудь новое делает, да? И так свободный софт не успевает, а они все жарят и жарят и денег гребут при Юэтом? Ваши обиды понятны:)
окалм придумали 25 лет назад, лисп 50+. о чем речь идет? кто это не успевает. не смеши.

2 Киянуш

Просто у F# и Ocaml отношение такое же как у Delphi и Pascal

это очень показательно, что ты делфи вспомнил;)

никого не копирует, имеет притягивающий синтаксис...

c’mon son;) get the f*** out of here with this bullsh*t

Типо, F# это тот же OCaml — слышал, но только в процессе получения информации по F#. Просто у F# и Ocaml отношение такое же

как у Delphi и Pascal

Киянуш,

вы про OCaml слыхали?

Не взлетит

Думаю взлетит, он предназначен для своей ниши рынка, никого не копирует, имеет притягивающий синтаксис...

Кажется F# выгодно отличается от невзлетевшего J#:

Заявленной целью разработки Visual J# было облегчение перехода разработчиков на Java с платформы Java на платформу.NET Framework. Однако эта цель достигнута не была по ряду причин, прежде всего из-за неполной совместимости J# с Java. Тем разработчикам на Java, которые всё же решили перейти на платформу.NET, оказалось в большинстве случаев проще изучить C# или Managed C++ и начать писать на нём, чем изучать отличия J# от Java и привыкать к нему. По этой причине Visual J# широкой популярности не получил

2 Деніс — ти віриш що МС-и нагребли грошей на F#?:)

восторг понятен, особенно после плюсов)


т.е. на смену блокам {} в С/С++ и begin... end пришел более... Вот тут я запнулся. Конечно, отмечать блоки отступами — круто,

но способ {} мне нравится не меньше, при таком форматировании кода видно начало и конец блока

я когда первый раз сел за питон, тоже жутко нервничал что нужно отступами блоки программы выделять, а потом даже как-то удобно стало, сам ЯП навязывает единое форматирование текста, имхо очень удобно. Не нужно ломать глаза читая сорцы приспешников M$, после того как привык к GNU, и наоборот, все унифицировано.
А вообще мне больше D понравился и Ocaml. Такие себе «прокачанные» Си, хотя как-то слабо верится в их промышленное применение.

З.Ы. Все поделки от мелкософта какими-то синтетическими кажутся

Подписаться на комментарии