в чем соль F#?

NataNata

Вычитал, что в .net 4.0 микрософт добавляет еще один язык F#.
Чем он принципиально отличается от имеющихся C# или VB#? Я что-то сходу, почитав доки, не сообразил.

pitrik2

Чем он принципиально отличается от имеющихся C# или VB#
скажи мне кто я и скажу те кто ты :)
а чем принципиально отличаются C# и VB#?

klyv

а сейчас он разве не поддерживается официально?

apl13

Мне интересней, чем он отличается от Паскаля.
Кстати, бемольные языки М-софт не планирует выпускать?

Andbar

Кстати, бемольные языки М-софт не планирует выпускать?
си-бемоль известен давно.

Papazyan

Не смотрел, что из себя представляет F# сейчас, но вообще это должен быть функциональный язык по типу SML или OCaml. Если ты не в курсе чем отличаются императивные (С#) и функциональные языки, почетай литературу.

6yrop

F# круче C# или у него своя ниша? Формочки на нем писать удобнее или нет? :)

timefim

Формочки на нем писать удобнее или нет?
В 2010той у F# проектов не будет дизайнера форм.

Marusetta

ну это как бы и есть окамль, только дотнет-стайл

timefim

http://a6systems.com/fsharpcheatsheet.pdf
Почти все фичи языка на 7 страницах.

Dasar

F# круче C# или у него своя ниша?
своя ниша.
всякие преобразования, логика и т.д.

lubanj

а можно какой-нибудь утрированный и боянистый пример, по типу факториала?

Dasar

а можно какой-нибудь утрированный и боянистый пример, по типу факториала?
let rec factorial n =
if n=0 then 1 else n * factorial(n - 1);;

lubanj

Пример с факториалом не показывает преимущества функционального языка для решения определенных задач
Да и я не про синтаксис языка спрашивал (в теме уже была ссылка на семь страниц хороших примеров а про его применение для решения логических штучек. Ну типа пример логической задачки и то как она легко и изящно в пять строк решается на F#. Какая-нибудь экспертная система? Или че-нить такое

kruzer25

let rec factorial n =
if n=0 then 1 else n * factorial(n - 1);;
По этому примеру не видно ни одного преимущества или недостатка F# перед C#. Все отличия - на уровне отличий фигурных скобок от паскалевских begin и end.

lubanj

спасибо, Капитан очевидность, что переписали еще раз мой пост

karkar

Пример красивой фичи - async workflows:
http://blogs.msdn.com/dsyme/archive/2007/10/11/introducing-f...

karkar

Помнится, на PDC был хороший рассказ про F# с убедительными и практичными примерами:
http://channel9.msdn.com/pdc2008/TL11/

pitrik2

Пример красивой фичи - async workflows:
ой
оно разными потоками выполняется
а зачем? чот не пойму смысла ...
и в каких местах может переключение потока произойти?

psihodog

http://channel9.msdn.com/pdc2008/TL11/
Круто! :cool:

karkar

а зачем? чот не пойму смысла ...
Некоторые операции (тот же ввод-вывод, особенно сетевой) занимают много времени. Они доступны как в обычном синхронном виде (когда функция не возвращает управление, пока не выполнится так и в асинхронном - возвращают управление сразу, а когда операция будет выполнена, могут вызвать твою функцию. Так можно начать операцию и вернуть управление рантайму, не заставляя поток висеть в ожидании (количество потоков ограничено, и каждый жрет память). Поток вернется в пул свободных и может быть использован для других запросов. Так можно какбэ одновременно обрабатывать гораздо больше запросов, чем доступно потоков. Использовать асинхронные функции раньше было довольно неудобно, т.к. надо разбивать свой код на множество более мелких функций, которые будут вызываться по завершении асинхронных операций. Упомянутая фича F# позволяет писать код в простой последовательной манере, лишь помечая асинхронные вызовы, а компилятор сам превратит это в нужный набор функций с передачей всех необходимых данных.

pitrik2

многабукв
там внутри тех функций тоже async что ли стоит?
типа эдакое дерево асинков получается?
или есть спец. команда типа yield которая переключение потока сделает?

karkar

Да, асинков может быть много вложенных.
Переключение произойдет неявно в месте с let!, например "let! rsp = req.GetResponseAsync".
В этом месте компилятор разобъет функцию на две - все, что до, и все, что после. Первая запустит асинхронную операцию и на этом завершится (тут поток может быть возвращен в пул вторая будет вызвана с результатом операции когда тот будет готов, возможно уже в другом потоке. Если у нас в исходной функции цепочка из N let!, то сгенерится N+1 функция, как я понял. Раньше надо было аккуратно писать все N+1 штук, поэтому этим мало кто заморачивался, поэтому аутлук в состоянии полного недеяния имеет полсотни активных потоков. :)

Helga87

Спасибо за ссылку на текток. Очень понятно и очень смешно рассказано.
Я правильно понимаю, что мы без проблем тут можем писать однопоточный код, который делает все асинхронно и для этого не надо призывать злых духов?

karkar

Таков замысел, по крайней мере.

Helga87

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

$.get("http://lala.com", function(data) {
alert(data);
$.post("http://lala.com/post", "some text", function(data2) {
alert(data2);
});
});

Ведь можно было бы довольно просто, не вылезая за рамки языка написать что-то типа

$.async(function {
data = $I.get("http://lala.com");
alert(data);
alert($I.post("http://lala.com/post", "some text";
})

Реализация этого будет не очень сложная и состоять в преобразовании текста функции из одного состояния в другое (благо js позволяет получить текст функции).
Оставить комментарий
Имя или ник:
Комментарий: