
Klei
20.05.2017
17:51:41
А есть TypeProvider, который может автоматом генерить по рекорду методы типа getId, getName, getAddress и т.п.?

Evgeniy
20.05.2017
17:54:46
@Kleidemos Для этого пригодились бы провайдеры, параметризуемые типами. Но их еще не реализовали.
Зачем такие методы нужны? В рекордах же есть обычные проперти.

Klei
20.05.2017
18:00:58

Google

Klei
20.05.2017
18:02:27
Заодно упращает выведение типов.

Evgeniy
20.05.2017
18:02:43
Ага, я понял.
@Kleidemos Было неплохое предложение на этот счет.
https://github.com/fsharp/fslang-suggestions/issues/506

Klei
20.05.2017
18:09:54

Evgeniy
20.05.2017
18:41:51
F# Weekly #21, 2017 - Welcome new FSSF board! #fsharp
https://sergeytihon.com/2017/05/20/f-weekly-21-2017-welcome-new-fssf-board/

Igor
20.05.2017
19:59:26
Кто-нибудь работал с проектом на fable 1.0?
Может подсказать, как туда добавить дополнительные nuget либы (типа react)?
На сайте написано через “dotnet fable add…”, но в dotnet пишет что это “deprecated” и нужно через paket (никогда не пользовался).

Evgeniy
20.05.2017
20:03:06
@angmarr Была новость, что Fable теперь действительно работает с Paket. Но сам еще не успел попробовать.

Igor
20.05.2017
20:03:45

Evgeniy
20.05.2017
20:24:44
@angmarr Попробовал.
Они теперь Paket прямо в шаблоне таскают.
В папке .paket

Igor
20.05.2017
20:25:51
Получилось react подключить?
Я вроде подключил и VSCode его видит, но при компиляции в JS показывается ошибка.
Module not found: Error: Can't resolve 'react' in ‘…/myfableapp/src’
Module not found: Error: Can't resolve 'react-dom' in ‘…/myfableapp/src’

Google

Evgeniy
20.05.2017
20:37:10
@angmarr Как проверить? Есть пример кода?

Igor
20.05.2017
20:40:17

Nikita
20.05.2017
20:41:08
Всем привет! Кто-нибудь шарит в Azure?

Evgeniy
20.05.2017
20:43:19
@angmarr Ок. А я наконец-то попробую Fable. :)
Раз уж все установлено теперь.

Max
20.05.2017
21:00:09

Dmitri
20.05.2017
21:05:28
Я вообще за любые функциональные извращения, но облачные особенно!

Nikita
20.05.2017
21:29:40
@shwars вот, собственно, сам вопрос - как использовать Face API, работая с ним прямо из Azure Mobile App, и возможно ли это вообще, а то у меня большие сомнения, т.к. ничего конкретного не нашел по этой теме

Dmitri
20.05.2017
21:30:38
Это обычный rest вызов. Плюс есть Face API sdk на нугете
С компьютере завтра пришлю ссылки

Nikita
20.05.2017
21:36:28
Спасибо, хотелось бы реальных примеров с гитхаба. При создании Mobile App создал сервер на .NET, но там внутри проекта только код инициализации таблицы TodoItems, а если подключиться к мобильному приложению через ftp, то добавить туда Face API через нугет не получится

Friedrich
21.05.2017
06:27:49
Друзья, а кто пробовал этот ComposableQuery? У меня что-то программа с ним компилируется, но не работает :(
https://gist.github.com/ForNeVeR/d4e9d15711186154e5e98ea55e434c90 (там программа и текст исключения)
Ок, моя ошибка в том, что я пытался использовать SqlProvider. Кажется, с ним совместимость хромает. Оформлю баг попозже.
Надо ставить FSharp.Data.TypeProviders, с ними работает.

Evgeniy
21.05.2017
07:13:33
Илья Привет!

Friedrich
21.05.2017
07:37:07
@neftedollar, вот тот пример, который я хотел получить на EF: https://gist.github.com/ForNeVeR/c09e21dabc840c9fd4af7600b8f363ae#file-program-fs-L37
Обрати внимание, что фильтры peter и admin хранятся в отдельных переменных, но я всё равно могу их взять и произвольным образом скомпозировать в запросе.
Выводы:
1) F# — молодец и задача решается прекрасно
2) FSharp.Linq.ComposableQuery ещё можно поработать над совместимостью с альтернативными провайдерами

Evgeniy
21.05.2017
07:40:46
@fvnever Выглядит неплохо.

Friedrich
21.05.2017
07:44:36
filterUsers даже не нужен (если не хочется иметь такую функцию), работает даже вот такое выражение:
query { for u in users do if (%admin) u && (%peter) u then yield u }
Вот это действительно хорошо, никакого бойлерплейта. Прекрасная технология.

Evgeniy
21.05.2017
07:47:56
@fvnever Спасибо методу Quote в query. :)

Friedrich
21.05.2017
07:53:22
Пойду файлить баг про совместимость с SQLProvider.

Google

Friedrich
21.05.2017
08:04:32
https://github.com/fsprojects/FSharp.Linq.ComposableQuery/issues/15 принёс.

Evgeniy
21.05.2017
08:58:47
@fvnever Возможно, нам придется самим это чинить.

Friedrich
21.05.2017
08:59:06
Там в тикете, кстати, интересная дискуссия началась. Мне указали на то, что некоторые выражения уже и так работают в SQLProvider (в частности, то самое, ради которого я всё это затевал). Отлично!

Evgeniy
21.05.2017
09:12:28
@fvnever Ага. Только кажется, что твое последнее сообщение имеет смысл продублировать в репе SQLProvider.

Friedrich
21.05.2017
09:12:39
А я в этом не уверен.
Сам об этом думаю.
Дело в том, что мне вообще вот этот кейс yield! (%filterUsers) (%peter) кажется надуманным. Мне он, например, не нужен; я его в коде написал только потому, что такой сэмпл у ComposableLinq.
Тот вариант запроса, который работает, мне на самом деле и нужен, и он мне кажется полезным. Я не думаю, что имеет смысл что-то менять в данном контексте: кажется, все полезные запросы работают как надо.

Evgeniy
21.05.2017
09:14:24
Хорошо.
> But if there is interest I may be able to find a summer intern to work on it
Какой хороший дядька!
@fvnever Как минимум документацию SQLProvider нужно дополнить.

Friedrich
21.05.2017
09:17:39
А первый кирпичик туда я и заложил! https://github.com/fsprojects/SQLProvider/commit/f08654573238cdfea33269c25d031d900c5ea817
Да, надо дописать про квотейшены.

Evgeniy
21.05.2017
09:19:16
@fvnever А сколько существует провайдеров для доступа к базам данных? Три?

Friedrich
21.05.2017
09:19:45
Да я уж сам запутался. Получается, что три? FSharp.Data.TypeProviders, SqlProvider и ещё какой-то третий.

Evgeniy
21.05.2017
09:20:10
http://fsprojects.github.io/FSharp.Data.SqlClient/
Третий.

Friedrich
21.05.2017
09:24:50
Привет!

Google

Evgeniy
21.05.2017
09:26:45
Artem Пожалуйте. :)

Roman
21.05.2017
10:01:41

Dmitri
21.05.2017
12:35:43
@niiiksh вызов когнитивных сервисов из F# с помощью простого REST API - https://notebooks.azure.com/sosh/libraries/pubtalks (посмотрите Azure Notebook, который на F#)

Admin
ERROR: S client not available

Nikita
21.05.2017
12:37:00
@shwars точно, забыл сказать, что я на C#

Friedrich
21.05.2017
12:37:28
Я уверен, что с доступом из C# там тоже всё в порядке :)

Dmitri
21.05.2017
12:37:33
@niiiksh на C# пример кода, не использующий REST API - https://docs.microsoft.com/en-us/azure/cognitive-services/face/quickstarts/csharp. Дальнейшие беседы по поводу C# и Azure Mobile Apps в этом чате думаю будут признаны оффтопиком. Переходите на F#!

Nikita
21.05.2017
12:40:46
@shwars а чем отличается код с использованием REST API от кода без REST API в данном случае?

Dmitri
21.05.2017
12:42:58
@niiiksh предлагаю перевести в приват, чтобы не спамить сообщество не связанными с F# сообщениями


Dmitry
21.05.2017
13:06:01
Я тут опять пытаюсь вспомнить суть async в F# (без постоянной практики через месяц улетучивается из мозга напрочь) и вот пытаюсь сделать асинхронный хендлер для HttpListener, да не выходит каменный цветок - два одновременных запроса никак разом не хотят выполняться, а бегут последовательно
open System.Net
let processRequest (context: HttpListenerContext) =
async {
let request = context.Request
let now = System.DateTime.Now.ToLongTimeString()
printfn "%s : Request for %s" now request.RawUrl
Async.Sleep 5000 |> Async.RunSynchronously
let response = "Hello world" |> System.Text.Encoding.UTF8.GetBytes
context.Response.OutputStream.Write(response, 0, response.Length)
context.Response.OutputStream.Close()
}
let listener = new HttpListener()
listener.Prefixes.Add("http://localhost:8080/")
listener.Start()
printfn "Listening..."
while true do
let context = listener.GetContextAsync() |> Async.AwaitTask |> Async.RunSynchronously
let now = System.DateTime.Now.ToLongTimeString()
printfn "%s : Incoming request" now
processRequest context |> Async.RunSynchronously
listener.Stop()
Ну, в смысле я понимаю, где и почему оно бежит синхронно - я не понимаю, как это переделать в правильный вариант?


Friedrich
21.05.2017
13:37:19
Мне кажется, тут вообще Async.RunSynchronously не нужен. Его надо убирать, чтоб работало в тредпуле.
Это не самое хорошее решение (т.к. оно без await, так что придётся маяться с обработкой ошибок), но принцип верный, кажется.
Ещё я там очень грязно по-быстрому завернул код обработчика в try / with _ -> (), чтоб не падали ошибки от убитых браузером подключений. Не делайте так в продакшене :)


Evgeniy
21.05.2017
13:55:28
@fvnever А не сделать ли в восьмой строке do!?

Friedrich
21.05.2017
13:57:16
@azazeo рекомендую ещё глянуть вот этот пост: http://stackoverflow.com/questions/15284209/async-start-vs-async-startchild

Google

Friedrich
21.05.2017
13:58:30
Надо б ещё OutputStream.Write заменить на WriteAsync или... AsyncWrite.
Внезапно, там есть и тот, и другой методы %)

Dmitry
21.05.2017
14:07:40
О, всем спасибо, вспомнено )

Evgeniy
21.05.2017
16:13:47
Форкманн опять взялся за улучшение сообщений об ошибках. \o/
@Nikolay_Scherbakov Привет!

Roman
21.05.2017
21:03:50
Привет!

Most
21.05.2017
22:05:03
ого

Roman
21.05.2017
22:07:23
Привет. Хорошо, что все же зашёл

Dmitri
21.05.2017
22:08:15
:)
Фшарп в райдере может сподвигнет меня чуть больше писать на Фшарп

Most
21.05.2017
22:11:32
@dnesteruk а студия/ionide почему не сподвигает?)

Evgeniy
22.05.2017
04:51:17
@MikeLoginov Пожалуйте. :)

Friedrich
22.05.2017
05:53:46
Привет!