@Fsharp_chat

Страница 78 из 772
Nikolay
26.04.2017
18:01:21
+ будет применим только в этом случае

А бывает ещё InputFile or String

Klei
26.04.2017
18:02:53
Я просто не понимаю, как с этим типом потом работать?

Google
Klei
26.04.2017
18:05:12
В прямом. Если есть разница, строка это или число, то видимо область применения их не идентична. А если область применения одна, то почему не использовать строку?

Vasily
26.04.2017
18:05:22
let inline Test<'a> (someId: 'a) = match box someId with | :? string -> Some someId | :? int -> Some someId | :? int64 -> Some someId | _ -> None

Вот так работает, но внутри боксинг

Roman
26.04.2017
18:10:02
Да
так сделай type ChatId = | IntId of int | StringId of string | BigIntId of int64 static member Create(x:int) = IntId x static member Create(x:string) = StringId x static member Create(x:int64) = BigIntId x // Где внутри, не в api let private getIdFromParser (id:obj) = match id with | :? string as x -> ChatId.Create x | :? int as x -> ChatId.Create x | :? int64 as x -> ChatId.Create x //снаружи везде использовать ChatId

Летучая
26.04.2017
18:10:30
Перегрузки создают копипасту)
Не во всех случаях же

1 метод грубо говоря принимает строку и делает дела

А другой дергает тустринг и первый метод

я б такое решение заюзал

Roman
26.04.2017
18:11:21
те кому надо сделать объект идентификатора, пусть пользуют Create, тебе же matchить надо будет толкьо при отправке сообщения. Все

Летучая
26.04.2017
18:12:32
Вон там даже в C# запилили конструкции private int Sum(int a, int b) => a + b;, наверняка в том числе для упрощенного вызова перегрузок

Roman
26.04.2017
18:13:00
Итого: полтора часа обсуждаем, как сделать красиво какую-то фигню :D
Это потому что ты не хочешь использвоать контейнер который нужно обрабатывать только на входе и выходе

А бывает ещё InputFile or String
Это не ChatId, а FileId

Google
Roman
26.04.2017
18:16:07
у тебя в доках прям написано) Сущность идентфикатор чата может быть либо то либо то, тебе же не надо эти айдишники складывать или еще что-то с ними делать, тебе достаточно знать что есть такой ChatId он приходит к тебе снаружи и ты его отдаешь назад. Сначала обернул, потом, в конце, развернул.

Nikolay
26.04.2017
18:18:26
Не во всех случаях же
Там 8 аргументов, копипаста

Летучая
26.04.2017
18:18:51
Там 8 аргументов, копипаста
Это телеграм столько параметров принимает?

Летучая
26.04.2017
18:19:02
Тогда оставляй

Nikolay
26.04.2017
18:19:05
Я сам толком не разобрался ещё чё и как там

Короче, я ещё больше запутался)

Летучая
26.04.2017
18:19:58
Оч похоже на танцы с бубнами на пустом месте ?

Nikolay
26.04.2017
18:20:52
Короче, скажите какой вариант будет самый нормальный, и я сделаю его)

Кроме преобразования в строку всего, это костыль, который сработает только в данном кейсе

Igor
26.04.2017
18:23:02
Народ, а есть какие-нибудь легкие видео-доклады про Computation expression, на тему "как они работают, как написать свой и тд"?

Roman
26.04.2017
18:23:24
https://github.com/SuaveIO/suave/blob/f0831e3ed00c611f78a04ac30d3a065403470274/src/Suave/Web.fs#L69 вот как suaveio работает с кучей значений. и вот как это выглядит в коде startWebServer defaultConfig (Successful.OK "Hello World!")

Igor
26.04.2017
18:25:11
ты про seq {}?
термин взял отсюда https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/computation-expressions#built-in-workflows

Перепутал с "computation expression"

Roman
26.04.2017
18:25:34
Там написано) нужно реализовать свой тип c вот этими полями, например https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/computation-expressions#Creating-a-New-Type-of-Computation-Expression

Evgeniy
26.04.2017
18:27:31
@neftedollar Я все еще извращаюсь. :) https://hastebin.com/eduwawajah.fs

Google
Evgeniy
26.04.2017
18:29:40
@neftedollar show 123

Roman
26.04.2017
18:29:44
Вообще не понимаю
давай сначала) что тебя смущает?)

Nikolay
26.04.2017
18:31:48
давай сначала) что тебя смущает?)
Я просто пытаюсь хоть что-то понять



Такое вообще впервые вижу

Roman
26.04.2017
18:32:20
это ты далеко зашел. давай с твоего кода.

Nikolay
26.04.2017
18:32:57
Ну мне всё то же самое сделать нужно)

И я просто хочу пойти код писать

Скажи мне как сделать)

Roman
26.04.2017
18:33:19
Я прост немного запутался, сначала мне казалось что проблема в chat_id

Nikolay
26.04.2017
18:33:33
Да, chat_id может быть int or string

Roman
26.04.2017
18:33:43
Снчала нужно описать типы которые есть в документации.

Nikolay
26.04.2017
18:33:51
Описал уже

Осталось методы прикрутить

Roman
26.04.2017
18:34:29
как ты сделал chat_id?

Nikolay
26.04.2017
18:34:31
getUpdates и getMe уже сделал, вот второй день пытаюсь придумать как сделать chat_id в sendMessage

Google
Roman
26.04.2017
18:35:13
не ты не понял, send_message должен работать с теми типами которые ты сделал

Nikolay
26.04.2017
18:35:13
А в типах нигде такого нет, только в аргументах, которые в урл как параметр передаётся

Roman
26.04.2017
18:35:24
давай сначала)

Первое что нужно это описать типы сущностей с которыми ты будешь работать.

Nikolay
26.04.2017
18:35:52
https://core.telegram.org/bots/api#available-types

Roman
26.04.2017
18:35:54
Почти везде тебе нужен chat_id

Nikolay
26.04.2017
18:35:58
Ты про это?

Roman
26.04.2017
18:36:23
Я в общем, но в данном случае да)

Nikolay
26.04.2017
18:36:37
Вот в той линке нигде нет Integer or String

Integer or String есть только в вызове методов

Пока не столкнулся с этой проблемой, я всегда использовал обычные аргументы функции, без создания отдельного типа под аргументы метода

Roman
26.04.2017
18:38:56
Увидел.

Тогда у тебя есть два варианта для sendMessage 1. Сделать две разные ф-ции одной на вход string, другой int

потом реализцию примерную напишу.

Klei
26.04.2017
18:42:08
Когда к тебе приходят chat_id, ты в курсе какой у него тип?

Nikolay
26.04.2017
18:42:44
Когда к тебе приходят chat_id, ты в курсе какой у него тип?
Так в sendMessage программист может указать любой тип

Roman
26.04.2017
18:43:03
2. Сделать DU только для ф-ции type SendMessage = |ChatId of in |Username of string

Nikolay
26.04.2017
18:43:44
sendMessage "@Dolfik" "Hello, world!" sendMessage message.From.Id "Hello, world!"

Google
Nikolay
26.04.2017
18:44:00
Roman
26.04.2017
18:44:29
И какой предпочтительней?
а можешь сразу оба

Nikolay
26.04.2017
18:45:12
С первым вариантом проще тем, кто будет юзать библиотеку (проще вызовы делать), а со вторым мне (меньше кода)?

Roman
26.04.2017
18:46:17
let sendMessage (id:SendMessage) options = .. let sendMessageId (id:Int) options = sendMessage ChatId(id) options let sendMessageUsername (username:string) = sendMessage Username(username) options

Roman
26.04.2017
18:47:43
подумай об использовании, from_chat_id руками будет задаваться очень редко

И все же я бы сделал даже для Int свою обертку. type ChatId = ChatId of int всегда работаешь с одним типом int не нужен нигде в коде, где нужен let myFunc (ChatId x) = x // а x уже int

Nikolay
26.04.2017
18:52:12
Т.е. через du?

Roman
26.04.2017
18:52:35
Да, с одним значением

Nikolay
26.04.2017
18:54:04
И ты предлогаешь его использовать в типе чат, в поле Id, вместо int?

Roman
26.04.2017
18:54:27
кстати его можно и расширить type ChatId = |ChatId of int member this.forSend() = SendMessage.ChatId (int) //Типа того

Nikolay
26.04.2017
18:55:17
А как он будет string принимать?

Roman
26.04.2017
18:55:31
А как он будет string принимать?
а ему не надо будет )

и это
только теперь вместо let sendMessageId (id:Int) options будет let sendMessageId (id:ChatId) options = sendMessage (id.forSend()) options // приблизительно

Evgeniy
26.04.2017
18:57:56
@neftedollar Укоротил код как мог.

@neftedollar https://hastebin.com/enopepuzeq.fs

Roman
26.04.2017
18:58:15
Можно наоборот у SendMessage сделать принимаемый тип ChatId

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