@Fsharp_chat

Страница 202 из 772
Летучая
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
сделай dsl типа get friend { ownerId 1 count 2} ?
Здесь к сожалению можно аргумент указать несколько раз

Google
Nikolay
07.06.2017
21:26:49
И нельзя сделать обязательный аргумент

get friend { ownerId 1 ownerId 2 ownerId n

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

get friend { ownerId 1 ownerId 2 ownerId n
а тут очевидно последний вариант будет выбран

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
Доброго вечера! Пишу библиотеку для работы с API VK, с полным покрытием всех методов, на тасках (https://github.com/Worldbeater/VkLibrary). Но в методах библиотеки сидит множество Nullable аргументов по умолчанию из C#, в связи с этим из F# очевидно обратиться к какому-либо методу можно только так: lib.Friends.Get (ownerId=Nullable 1, count=Nullable 2), а это как-то не очень-то функционально, да ещё лишние нуллаблы. Думаю написать для удобства использования с F# дополнительно обёртку к либе, с каррированными клонами методов C#. Какие ещё фичи можете посоветовать добавить, чтобы было удобно ей пользоваться разработчикам и лично вам? Нужен мудрый совет наставника из мира ФП :)
1) а смысл юзать какую-то непонятную либу с 10 звездами для vk, если - обычный rest api с жсоном черех хттп? избыточный слой же 2) что плохого в Nullable 1 и в каком месте это не функционально и что предполагаемому пользователю даёт карирование? я в курсе что в f# в место nullable есть option. но блин переписывать из-за nullable существующий код...

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 == пробный

Pawel
08.06.2017
06:23:15
Вот пример, jsonTestMessage ужасен: https://github.com/Dolfik1/Funogram/blob/master/Funogram.Tests/Constants.fs
Не понял твою мысль. Для C#-ных классов, на которых построена та либа, нет проблемы с созданием объекта со значением по умолчанию. Поля nullable можно не указывать, и они будут null.

Vasily
08.06.2017
06:28:34
Опять ты наезжаешь по надуманному поводу. Хочет либу пишет. А мы тут чтоб помогать.
В жизни каждого наступает момент,когда кажется, что я всемогущ,а остальные жалкие черви.С качеством кода коррелирует редко.

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
1) чтобы не тратить время на поиск курение доков, написание своих костылей и генерацию типов из жсонов (порядка 300 штук, хотя тут для C# проблема стоит более остро, чем для F#).
1) чтобы работать с апи вк, тебе всё равно придётся изучать на него документацию чтобы понять, что вообще с ним можно сделать 2) каких костылей? 3) зачем создавать тип, если нужно всего то извлечь данные из жсон ?

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

Летучая
08.06.2017
06:45:20
1) чтобы работать с апи вк, тебе всё равно придётся изучать на него документацию чтобы понять, что вообще с ним можно сделать 2) каких костылей? 3) зачем создавать тип, если нужно всего то извлечь данные из жсон ?
1) вот для этого доки с вк.ком/дев тоже спарсены в хмл-доки либы! :) 2) тут будет вернее сказать велосипед, пожалуй, неправильно выразился. 3) код вида: let a = obj.["one"].["two"].["three"] менее привлекателен, чем let a = obj.One.Two.Three и в нём не работает IntelliSence!

Pawel
08.06.2017
06:48:36
С json фишка в том, что проще создать тип,чем извлечь конкретные данные,имхо
смотря какую конечную цель ты приследуешь. Если насоздавать типов - то базара нет. Вопрос в том, зачем создавать типы если конечная цель - получить данные

Vasily
08.06.2017
06:51:40
смотря какую конечную цель ты приследуешь. Если насоздавать типов - то базара нет. Вопрос в том, зачем создавать типы если конечная цель - получить данные
Я могу повторить мысль и немного расширить.Природа json не предполагает вменяемого поиска по документу. Условно,линзу на определенное поле написать сложно и непрактично.

Поэтому создание типа тут - в общем-то естественный процесс

В xml том же с такими сценариями попроще

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
Prop можно глянуть реализацию?
let (|Prop|_|) key = function | Object x -> x |> Map.tryFind key | _ -> None

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
Точнее как заполняется, извиняюсь
по ссылке про это написано. Жсон парсится в монаду JsonValue

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
Ну например, ты какую-нить базу КЛАДР выгружаешь :)

Которую криво спроектировали

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