
Artem
18.08.2017
11:03:04

Artemy
18.08.2017
11:03:22

Vlad
18.08.2017
11:03:28
на самом деле фридрих сидит в виме и не признается.

Friedrich
18.08.2017
11:03:40

Google

Fill
18.08.2017
11:03:59

Artemy
18.08.2017
11:04:28
На самом деле, F# можно везде использовать. Полноценный язык.
Кроме UWP пока что.)

Artem
18.08.2017
11:05:02

Дед Пегас
18.08.2017
11:05:30
Он всё!

Roman
18.08.2017
11:05:30

Friedrich
18.08.2017
11:05:36

Artemy
18.08.2017
11:07:00
Ну с WPF сейчас всё более менее

Friedrich
18.08.2017
11:07:00

Artem
18.08.2017
11:07:36

Friedrich
18.08.2017
11:08:11
Ну с WPF сейчас всё более менее
Ну как сказать... наши F#-ребята нашли способы настрополить некоторые библиотечки, которые делают взаимодействие с WPF возможным. Это не нативный опыт; не тот же самый, который получают пользователи C#. Но возможность есть, да. У меня есть небольшие проекты, где это используется.

Artemy
18.08.2017
11:13:26
Ну FsXaml + FSharp.ViewModule нормально работает. Их пробовал.
Ещё бы Gjallarhorn глянуть

Google

Evgeniy
18.08.2017
11:17:45

Artemy
18.08.2017
11:18:16
Там Signal и Mutable
Мне напоминает View и Var из WebSharper.UI.Next

Evgeniy
18.08.2017
11:20:38
А сложно будет эти библиотеки под Avalonia портировать?

Artemy
18.08.2017
11:21:34
Инфы маловато. Про привязку данных документации вообще нет, вроде.

Evgeniy
18.08.2017
11:24:06

Artemy
18.08.2017
11:24:26
Ну FsXaml — это провайдер типов для XAML.
Завязки на WPF не должно быть
Да и ViewModule, наверное, тоже можно не с WPF использовать.
С ГитХаба: "Library providing MVVM and INotifyPropertyChanged support for F# projects"

Evgeniy
18.08.2017
11:26:48
Надо бы изучить. Хочу утилиту на авалонию написать.

Artemy
18.08.2017
11:27:33
Думаю, должно получиться.
С ViewModule и из C# работать можно. Там в репе пример есть.
А в репе Gjallarhorn есть пример для Xamaring.Forms
@gsomix http://i.imgur.com/LAJIua7.png
В контексте: http://i.imgur.com/dqlEanJ.png

Evgeniy
18.08.2017
11:50:29

Летучая
18.08.2017
12:02:10
Ты же впф/увп дед! Помоги. :)
https://github.com/Worldbeater/Funlan/blob/master/Funlan/ViewModels.fs вот короче работающий код (но в качестве примера юзать не стоит, там императивщина и нуллы, писал в кач-ве своего первого пета на фшарпе для универа)

Google

Nikolay
18.08.2017
12:02:25
Ух!
А есть ещё мой пример DSL ?
https://github.com/fsharplang-ru/translations/issues/16
Могу заняться переводом чего-нибудь

Vlad
18.08.2017
17:41:57
-

Evgeniy
18.08.2017
17:46:05

Nikolay
18.08.2017
17:48:23

Evgeniy
18.08.2017
17:48:38

Iskander
18.08.2017
17:55:05
Добрый вечер! Такой вопрос, если есть некий сервис, в котором бОльшая часть работы - сортировка\фильтрация\выборка\математические вычисления, то насколько выгодно написать эту часть на F#? Какие преимущества можно получить по сравнению с C#\LINQ?
Например, такой пример, можно ли более лаконично переписать это на F#?
https://pastebin.com/SxbA26Tq

Evgeniy
18.08.2017
17:57:49
https://twitter.com/kot_2010/status/898600325782749186
@IskanderRaimbayev А можно определение Room?
Я попробую набросать пример на F# и кое-какие соображения напишу.

Iskander
18.08.2017
18:16:23
https://pastebin.com/Ke1MCRmv
Что-то вроде этого
Важный момент - RoomType позже может стать отдельной таблицей, а не конечным множеством, как сейчас
т.е. если позже RoomTypes будут в виде некой таблицы в БД, расширяться в рантайме, то каждый раз код править придется

Google

Nikolay
18.08.2017
18:25:25
http://fsharpforfunandprofit.com/learning-fsharp/
Этой статьи кажется нет в issue, я думаю будет полезным её перевести
И на C# можно написать лаконичнее:
rooms.Where(p =>
rulesOfSort.Any(r => p.RoomType == (RoomTypeEnum)r))
.ToList()

Iskander
18.08.2017
18:29:44

Nikolay
18.08.2017
18:30:40
Вообще в IEnumerable почти все методы возвращают новую последовательность, кроме ForEach, Remove, может ещё несколько
Но я предложил бы не оффтопить тут, а переместиться, например, в .Net Talks

Iskander
18.08.2017
18:35:21
Filter возвращает новую последовательность по заданному предикату
Да, у вас более точное определение filter. В моем же случае возвращаемая коллеция является полной копией полученной, лишь меняется порядок элеметов - разве это не Sort? Да, задам этот вопрос в другой группе, здесь я хотел узнать, наксколько выгодно\удобнее написать все аналогичные элементы логики в ФП\f#

Evgeniy
18.08.2017
18:52:40
@IskanderRaimbayev Я начал писать, но, кажется, провалился. :)
Если правильно подойти к созданию правил для сортировки.
То все уместится в пару простых функций.

Nikolay
18.08.2017
18:54:30
У меня в рабочем проекте есть экстеншн метод для такого случая
rooms.OrderByKeys(rulesOfSort, p => (int)p.RoomType).ToList()


Evgeniy
18.08.2017
18:57:26
@IskanderRaimbayev Мое короткое решение, на оптимальность, конечно, не претендую.
let makeRule (orderedRoomTypes : #seq<RoomType>) =
orderedRoomTypes
|> Seq.mapi (fun ord rt -> (rt, ord))
|> dict
let sortRoomsByRule (rooms : #seq<Room>) (rule : IDictionary<RoomType, int>) =
rooms
|> Seq.sortBy (fun r -> rule.[r.roomType])
Но есть пара моментов, которые для меня очень важны в таких задачах.
Во-первых, в F# можно писать generic numeric code.
http://tomasp.net/blog/fsharp-generic-numeric.aspx/
Во-вторых, есть units of measure, которые повышают корректность кода.
https://fsharpforfunandprofit.com/posts/units-of-measure/
И в конце, конечно, система типов довольно приятная в F#. Например, можно легко написать враппер-тип над тем же int.
Вот, например, как я определил RoomType. По сути это новый тип-обертка над обычным int. Это тоже дает некоторые дополнительные статические гарантии.
type RoomType = RoomType of id : int

Google

Evgeniy
18.08.2017
19:12:37
То есть выигрыш я вижу в чуть более удобной системе типов, ибо в функции высшего порядка, кажется, все языки худо-бедно умеют.

Igor
18.08.2017
19:18:57
А правда что async { } всегда создает новый тред?
Если я делаю там что-то тяжелое, но синхронное - это не страшно (нигде НЕ используется RunSynchronized)?

Evgeniy
18.08.2017
19:31:47

Igor
18.08.2017
19:32:38

Egoarka
18.08.2017
19:33:27
@angmarr await Task.Run(() => {}); ?

Igor
18.08.2017
19:34:48

Egoarka
18.08.2017
19:36:09
ой, ну да, извините)

Aleksander
18.08.2017
19:40:42
если ты хочешь вызвать что-то тяжелое из UI потока, и не хочешь его блокировать, то наверное так:
let! result = Async.StartChild heavyStuffWrappedInAsync

Evgeniy
18.08.2017
19:48:45
Привет! o/

Nikolay
18.08.2017
20:00:37
Как насчёт того, чтобы помещать переводы с fsharpforfunandprofit в одну папку?

Evgeniy
18.08.2017
20:01:24

Nikolay
18.08.2017
20:01:55
Ну никто не ответил, и я начал переводить http://fsharpforfunandprofit.com/learning-fsharp/
Просто задумался, куда его закинуть
По идее:
F# for fun and profit/learning-fsharp.md