
Летучая
07.06.2017
21:15:11
Доброго вечера! Пишу библиотеку для работы с API VK, с полным покрытием всех методов, на тасках (https://github.com/Worldbeater/VkLibrary). Но в методах библиотеки сидит множество Nullable аргументов по умолчанию из C#, в связи с этим из F# очевидно обратиться к какому-либо методу можно только так: lib.Friends.Get (ownerId=Nullable 1, count=Nullable 2), а это как-то не очень-то функционально, да ещё лишние нуллаблы.
Думаю написать для удобства использования с F# дополнительно обёртку к либе, с каррированными клонами методов C#. Какие ещё фичи можете посоветовать добавить, чтобы было удобно ей пользоваться разработчикам и лично вам? Нужен мудрый совет наставника из мира ФП :)

Roman
07.06.2017
21:24:55
сделай dsl типа
get friend { ownerId 1
count 2}
?

Nikolay
07.06.2017
21:26:15

Roman
07.06.2017
21:26:44

Google

Nikolay
07.06.2017
21:26:49
И нельзя сделать обязательный аргумент
get friend {
ownerId 1
ownerId 2
ownerId n

Roman
07.06.2017
21:28:04
часто внутри ownerId меняет состояние какого-нибудь дефолтного объекта запроса.

Nikolay
07.06.2017
21:28:35
И ещё автодополнение не подскажет
Хотя это не функционально

Roman
07.06.2017
21:31:32

Nikolay
07.06.2017
21:32:17
Я до сих пор с этим не могу смириться, постоянно ищу альтернативу
И плачу по ночам

Roman
07.06.2017
21:32:35

Nikolay
07.06.2017
21:32:35
?

Google

Nikolay
07.06.2017
21:33:03
Если мне что-то не нравится, мне это не даёт покоя :)

Evgeniy
08.06.2017
04:35:10
@neftedollar https://github.com/kjnilsson/fez

Pawel
08.06.2017
04:39:19


Nikolay
08.06.2017
05:26:25
Он же написал, что множество таких аргументов
Вот пример, jsonTestMessage ужасен: https://github.com/Dolfik1/Funogram/blob/master/Funogram.Tests/Constants.fs

Evgeniy
08.06.2017
05:53:07
> dsyme
> I would be interested in helping trial F# [CNTK] support. Either that or I would use work on TensorFlow + F# :)

Pawel
08.06.2017
06:04:09
а что такое trial F# ?

Friedrich
08.06.2017
06:06:55
Суд над F#.

Evgeniy
08.06.2017
06:08:29
*trial == пробный

Летучая
08.06.2017
06:14:31

Pawel
08.06.2017
06:23:15

Roman
08.06.2017
06:25:11

Pawel
08.06.2017
06:27:03

Roman
08.06.2017
06:28:18

Vasily
08.06.2017
06:28:34

Roman
08.06.2017
06:29:39

Vasily
08.06.2017
06:29:41
А по поводу либы @Dolfik -человек растет в процессе ее написания,и это очень круто

Evgeniy
08.06.2017
06:34:48
А это где?
https://github.com/Microsoft/CNTK/issues/960#issuecomment-306973463

Google

Vasily
08.06.2017
06:36:03
@Dolfik я тут подумал насчет обязательных методов, в целом можно попробовать сделать путем переноса в параметры конструктора билдера
Ну и для методов с однозначным выбором нет смысла использовать биллеры
*билдеры

Evgeniy
08.06.2017
06:37:45
@neftedollar Мне кажется маловероятным, что в CNTK появится полноценная поддержка дотнета. В соседнем issue они даже думают прекратить поддержку BrainScript в пользу Python и C++.

Pawel
08.06.2017
06:39:49

Vasily
08.06.2017
06:42:41
С json фишка в том, что проще создать тип,чем извлечь конкретные данные,имхо

Летучая
08.06.2017
06:45:20

Pawel
08.06.2017
06:48:36

Vasily
08.06.2017
06:51:40
Поэтому создание типа тут - в общем-то естественный процесс
В xml том же с такими сценариями попроще

Pawel
08.06.2017
06:53:23

Vasily
08.06.2017
06:54:44
JPath штука ограниченная,как я помню

Летучая
08.06.2017
06:59:52
Хттп-запросник, парсилки для оауф, подписывалка токенами и ключами (это все несложно пишется, конечно). Но с либой ты сразу пишешь let friends = lib.Friends.Get() и сразу понимаешь, что делает этот код из хмл-доков (не страдаешь), а без либы ты читаешь документацию, пишешь запросник, дебажишь и при обработке полученных данных тебе не помогает интеллисенс (страдаешь).

Vasily
08.06.2017
07:02:51
Чет меня осенило,что по факту работа с внешним источником данных-тоже система линз

Pawel
08.06.2017
07:13:04
== Условно,линзу на определенное поле написать сложно и непрактично
извлечь значение поля жсон по его пути в F# way с использованием активных шаблонов и functional Json - одна строчка кода. могу привести пример Пропысывать типы на все поля - много строчек. В чём профит типов?

Vasily
08.06.2017
07:14:41
ССылку на либу можно?

Pawel
08.06.2017
07:15:02
какую либу?

Vasily
08.06.2017
07:15:37
ну пример functional json
Там же под капотом какая-то либа ведь

Google

Vasily
08.06.2017
07:16:32
Или магия

Pawel
08.06.2017
07:19:55
http://fsharp.github.io/FSharp.Data/library/JsonValue.html

Vasily
08.06.2017
07:21:42
Ну по факту создается объект JsonValue
По которому ты потом идешь
Т.е. объект обобщенный создается в любом случае

Pawel
08.06.2017
07:26:04

Vasily
08.06.2017
07:26:11
В итоге получается, что сначала мы парсим Json в объект, потом идем по его свойствам
Вот если бы можно было парсить сразу в типизированный объект...
Без промежуточного

Pawel
08.06.2017
07:30:17
примерно так линза json выглядит на практике - парсит она в самый что ни на есть типизированный объект
let (|ApiError|_|) : Json -> (string * string * string ) option = function
| Prop "error"
(Prop "data"
(Prop "exceptionname"
(String exceptionname) &
(Prop "errorCode" ( String errorCode) ) &
(Prop "errorDetails" ( String errorDetails) ) )) ->
Some(exceptionname, errorCode, errorDetails)
| _ -> None

Vasily
08.06.2017
07:30:58
Prop можно глянуть реализацию?

Pawel
08.06.2017
07:32:05

Vasily
08.06.2017
07:32:24
А как Map создается?

Pawel
08.06.2017
07:32:50
это стандартная структура данных F#

Vasily
08.06.2017
07:33:04
Точнее как заполняется, извиняюсь
Object - кастомный тип, как я понимаю

Pavel
08.06.2017
07:35:26
https://github.com/claruspeter/MetaTp/blob/master/readme.md
Не знал о такой штуке

Vasily
08.06.2017
07:36:48
Хммм

Google

Vasily
08.06.2017
07:36:53
Таки сделали, шоле?
Надо глянуть

Friedrich
08.06.2017
07:38:27
Я думаю, это не то, что ты думаешь :)
Это просто либа для удобного создания провайдеров по шаблону.

Vasily
08.06.2017
07:39:01
Пичаль
Хнык

Pawel
08.06.2017
07:39:33

Vasily
08.06.2017
07:39:51

Pawel
08.06.2017
07:42:11
да

Evgeniy
08.06.2017
07:44:30
Pavel Был еще один забавный TP, созданный с целью упрощения написания TP.
https://fsprojects.github.io/RestProvider/


Pawel
08.06.2017
07:51:32
Хттп-запросник, парсилки для оауф, подписывалка токенами и ключами (это все несложно пишется, конечно). Но с либой ты сразу пишешь let friends = lib.Friends.Get() и сразу понимаешь, что делает этот код из хмл-доков (не страдаешь), а без либы ты читаешь документацию, пишешь запросник, дебажишь и при обработке полученных данных тебе не помогает интеллисенс (страдаешь).
"Хттп-запросник, парсилки для оауф, подписывалка токенами" у всех свои и навязывать юзеру свою имплементацию я бы не стал. Имхо это не есть задача прикладной либы для вызова rest api, и надо дать юзеру возможность сделать всё своё. Это на много даже важнее, чем дефолтная имплементация, которую тоже в принципе можно прикрутить
с lib.Friends.Get() у меня лично проблема такая - 1) если что-то пойдёт не так, она кинет эксепшен, который хрен поймёшь и хендлить в лом 2) тип объекта, который она возвращает, для конечного пользователя в 90% случаев избыточен, и интелисенс ни как не способствует пониманию


Vasily
08.06.2017
08:03:11
В общем, я какую мысль пытался донести про json - нельзя из него вытащить поле, не преобразовав предварительно в объект

Pawel
08.06.2017
08:03:49
так это гут или нет?

Vasily
08.06.2017
08:04:01
Не знаю
Тут я не готов давать оценочные суждения
В сценариях, когда json большой, а памяти мало - не очень
С другой стороны, в том же xml тоже нет поиска по потоковому ридеру

Pawel
08.06.2017
08:06:24
это что за rest api такое, у которого посылки не помещаются в мозгах?

Vasily
08.06.2017
08:06:57
Ну например, ты какую-нить базу КЛАДР выгружаешь :)
Которую криво спроектировали