@Fsharp_chat

Страница 143 из 772
Nikolay
19.05.2017
09:16:31
@Dolfik Поясни.
let a = "blablabla" printf a

Pawel
19.05.2017
09:16:44
printf "%s" a

Nikolay
19.05.2017
09:16:51
Блин, точно)

Google
Friedrich
19.05.2017
09:19:40
Ну так это делается с iqueryable оч хорошо.
Неа, не делается. Вот пример (на C#): Expression<Func<User, bool>> a, b ,c; Users.AsQueryable().Where(u => a(u) && b(u) && c(u)); // не скомпилируется: у Expression<T> нет оператора круглых скобок

Friedrich
19.05.2017
09:20:25
вот я тоже тут проблем не вижу если делать внутри query{...}
А что именно делать внутри query? Как мне часть запроса вынести в переменную? (Просто, ну, я и правда могу чего-то не знать — может, там есть такая фича)

Friedrich
19.05.2017
09:21:31
У тебя users уже должны быть queriable а не материализованными данными.
Я для примера показал. Всё равно не скомпилируется.

Roman
19.05.2017
09:21:33
А так блин

Friedrich
19.05.2017
09:22:17
Ты что-то не то делаешь
Я делаю то, что всегда делаю: пишу программу, вынося кусочки (частично применённые функции и что угодно ещё) в переменные. Да, с SQL оно так просто не работает. Нет, ограничение это не фундаментальное, и его можно решить.

Friedrich
19.05.2017
09:22:51
Решается ли это в рамках текущих или будущих технологий F#, и такая ли уж это нужная фича — вопрос дискуссионный.

Мне на каждом проекте приходится решать эти вот проблемы программируемых запросов. Где-то более успешно, где-то менее. Кое-где даже строки конкатенируем, и это ужас-ужас :)

Для EF и System.Linq.Expressions я себе решение наколдовал, кстати, но оно мне не очень нравится — в промышленных масштабах не поиспользуешь. Если бы F#, например, давал возможность типобезопасно композировать кусочки запросов, то на .NET-стеке это бы точно было киллер-фичей для некоторых проектов.

Google
Friedrich
19.05.2017
09:26:25
(и у меня нет уверенности, что сделать такое на сегодняшнем F# невозможно — можно и попробовать)

Pawel
19.05.2017
09:26:53
Roman
19.05.2017
09:27:19
Решается ли это в рамках текущих или будущих технологий F#, и такая ли уж это нужная фича — вопрос дискуссионный.
Во, код писать не могу, но помню что пример был у бындю http://blog.byndyu.ru/2014/07/command-and-query-responsibility.html?m=1

Pawel
19.05.2017
09:28:00
здесь пример как трансформировать вручную : http://stackoverflow.com/questions/42583018/sqlprovider-recursively-composing-queries

Friedrich
19.05.2017
09:28:06
вот они показывают как комозить запросы. Так пойдёт? https://fsprojects.github.io/SQLProvider/core/composable.html
Пойдёт, но частично. Это композируемость примерно того же уровня, что и в EF. Она не решает, например, вышеприведённой проблемы с a(u) && b(u) && c(u).

Friedrich
19.05.2017
09:30:52
Видимо ты так и не донёс до меня проблему
Ну вот же проблема: есть три экспрешена, a, b и c. Надо выбрать из базы объекты, которые отвечают выражению User u => a(u) && b(u) && c(u).

Pawel
19.05.2017
09:31:55
Roman
19.05.2017
09:32:37
Это решается. Я буду к компа напишу.

Friedrich
19.05.2017
09:33:08
Мне и правда интересно, как другие предложат её решить, в особенности с помощью SQLProvider, с которым я не очень хорошо знаком.

Artemy
19.05.2017
09:33:17
@fvnever а как насчёт этого: http://fsprojects.github.io/FSharp.Linq.ComposableQuery/ ? Правда, лично пока ещё не пробовал.

Friedrich
19.05.2017
09:35:02
Artemy
19.05.2017
09:35:45
Странно только ,что относительно долго не обновляется.

Friedrich
19.05.2017
09:37:02
Предположу, что мало кому нужны настолько сложные запросы, поэтому пользователей мало, и поток issues тоже небольшой.

Friedrich
19.05.2017
09:38:50
А напиши плз реализацию a(u)
Пусть будет так: Expression<Func<User, bool>> a = u => u.Id != Guid.Empty;

Google
Roman
19.05.2017
09:41:39
@Dolfik телеграм обновил API)

Nikolay
19.05.2017
09:41:53
Пока блин времени нет заниматься библиотекой :(

Roman
19.05.2017
09:42:35
Нуок

Evgeniy
19.05.2017
09:46:25
Artemy @fvnever А ведь про ComposableQuery как раз в том видео с Вадлером говорится. :)

Friedrich
19.05.2017
09:46:47
Ок, я эту библиотечку посмотрю.

k0balt
19.05.2017
09:49:33
а нельзя что-то типа a(b(c(Users))), где a, b, c эти users.Where(u => u.Id != Guid.Empty) ?

Friedrich
19.05.2017
09:49:53
а нельзя что-то типа a(b(c(Users))), где a, b, c эти users.Where(u => u.Id != Guid.Empty) ?
Да, можно, но это работает только для варианта && :)

Evgeniy
19.05.2017
09:50:09
@fvnever И видео!

Friedrich
19.05.2017
09:50:11
Если хочется a || b || c — тогда уже фейл.

k0balt
19.05.2017
09:50:27
а, ну да

Artemy
19.05.2017
09:52:47
@gsomix да, действительно. Спасибо за видео, схоронил. :)

Nikolay
19.05.2017
10:00:04
При запуске F# аппы: System.TypeInitializationException was unhandled Message: An unhandled exception of type 'System.TypeInitializationException' occurred in DumpsDownloader.exe Additional information: Инициализатор типа "<StartupCode$DumpsDownloader>.$Program" выдал исключение.

Friedrich
19.05.2017
10:04:15
А какое исключение-то? :)

Igor
19.05.2017
10:06:30
А напомните почему в F# нет “Optional function arguments”? Сейчас узнал что они есть в OCaml и SML Кстати, прикольное сравнение языков http://adam.chlipala.net/mlcomp/

Evgeniy
19.05.2017
10:07:58
@angmarr > We decided against this in F# 2.0/3.0. There were good reasons for this: among other things, the OCaml syntax is unwieldy when there is a fair amount of object/member programming going on as well.

Это про named arguments, но optional там рядом.

@angmarr В SML же тоже нету.

Igor
19.05.2017
10:14:07
@angmarr В SML же тоже нету.
Блин точно, там в примере через Option сделано (интересная замена ?)

Nikolay
19.05.2017
10:16:12
А какое исключение-то? :)
Вот скинул выше всё, что возникает

Google
Friedrich
19.05.2017
10:16:34
Вот скинул выше всё, что возникает
Чот не оч! Давай дебаг тогда.

Nikolay
19.05.2017
10:19:18
Settings.Load("settings.json")

Из за этого

type Settings = JsonProvider<""" { "dumpsPathOnServer":"/home/dumps", "saveToLocal":"C:/db-dumps", "serverAddress": "localhost", "serverPort":22, "serverLogin":"root", "serverPassword":"password" } """>

Или Settings.Load это не загрузка из JSON файла, а что-то другое?)

Не пойму, как с помощью Json Provider'a распарсить файл. Если файл до запуска существует, то всё ок, иначе падает

Artemy
19.05.2017
11:39:55
Падает, если файла не существует даже во время компиляции?

Nikolay
19.05.2017
11:40:53
В смысле "до запуска существует"?
Settings.Load("settings.json") Выбрасывает исключение при запуске, если settings.json не существует (до выполнения этого кода)

Admin
ERROR: S client not available

Evgeniy
19.05.2017
11:41:07
@Dolfik Справку по Load читал?

Nikolay
19.05.2017
11:41:10
После запуска, но до выполнения кода

@Dolfik Справку по Load читал?
В описании метода написано: Loads JSON from specified URI

Artemy
19.05.2017
11:42:51
Я так понимаю, оно и должно просто парсить файл.

Непонятно, как оно определяет существование файла до того, как этот код сработает.

Nikolay
19.05.2017
11:43:22
А как быть, если файла нет?

У меня перед этим кодом стоит проверка, если файла нет, он создаётся

Artemy
19.05.2017
11:43:46
Ну он ведь есть к тому моменту, когда Load вызывается?

Nikolay
19.05.2017
11:43:49
Но не прокатывает)

Google
Evgeniy
19.05.2017
11:44:08
@Dolfik Ты уверен, что он создается там, где надо?

Nikolay
19.05.2017
11:44:21
Ну он ведь есть к тому моменту, когда Load вызывается?
Когда приложение запускается - файла нет, перед вызовом Settings.Load, файл создаётся, если его нет

Evgeniy
19.05.2017
11:44:27
Можешь поставить бряк до Load?

Nikolay
19.05.2017
11:44:36
Можешь поставить бряк до Load?
Да, не попадает туда

Artemy
19.05.2017
11:44:44
@Dolfik, точно создаётся?

Nikolay
19.05.2017
11:44:49
Вообще даже на первую строчку кода не попадает

Короче, это странно немного

Artemy
19.05.2017
11:46:43
Ну, чисто логически: как можно узнать о том, что файла нет до того, как осуществляется запрос к нему?

Так что, видимо, файла просто нету к моменту вызова Load

Evgeniy
19.05.2017
11:47:16
http://stackoverflow.com/questions/33630308/f-xml-provider-system-typeinitializationexception-when-writing

@Dolfik Проверь еще раз пути, и все такое.

И покажи, пожалуйста, код целиком.

Кажется, у тебя с отладкой проблема из-за того, что ты загрузку пытаешься в значение на уровне модуля запихнуть.

А это происходит при инициализации класса. Помнишь, что модули компилируются в классы?

Nikolay
19.05.2017
12:00:09
Блин, ошибка в другом была)

Щас покажу интересную штуку

type Settings = JsonProvider<""" { "test":"test" } """> let notUsed = Settings.GetSample().JsonValue.AsString() [<EntryPoint>] let main argv = printf "Application started.\nParsing settings..." 0 // return an integer exit code

При запуске получаешь System.TypeInitializationException

Пока не закомментишь строку let notUsed = ...

втф?

Evgeniy
19.05.2017
12:03:58
Ошибка во время инициализации класса.

Сделай из notUsed функцию и вызови в main.

Nikolay
19.05.2017
12:05:18
Блин, точно, я идиот :D

Страница 143 из 772