
Nikolay
26.04.2017
18:58:52
Мне уже даже неловко)

Roman
26.04.2017
18:58:53
ща

Google

Klei
26.04.2017
19:04:52
Я пошел спать, но накалякал тут, хз имеет ли это право на жизнь:
[<AutoOpen>]
module ChatId =
type private _chatId =
| OfInt of int
| OfBigInt of bigint
| OfString of string
type ChatId private (chatId : _chatId) =
new (chatId) = ChatId (OfInt chatId)
new (chatId) = ChatId (OfBigInt chatId)
new (chatId) = ChatId (OfString chatId)
member private this.Content with get () = chatId
override this.ToString() = chatId |> string
override this.Equals(other) =
match other with
| :? ChatId as other -> other.Content = this.Content
| _ -> obj.Equals(other, this)
override this.GetHashCode() = this.Content.GetHashCode()
let p0 = ChatId 12
let p1 = ChatId "qwe"
let p2 = ChatId 12I

Evgeniy
26.04.2017
19:11:26
@neftedollar Да, получилось интересно. Главное, чтобы никто не додумался это в реальном коде использовать.

Roman
26.04.2017
19:15:01
ща
module A =
type ChatId = | IntId of int
type Username = | Username of string
type ChatType = | Private | Group | Supergroup | Channel
//https://core.telegram.org/bots/api#chat
//Это приходит из телеграма.
type Chat = {
Id : ChatId
Type : ChatType
Title : string option
Username : Username option
AllMembersAreAdmins : bool
/// ...
}
type SendChatId =
| Id of ChatId
| Username of Username
let sendMessage (id:SendChatId ) options = () ///http.Call POST ...
// или
module B =
type ChatID =
| Id of int
| Username of string
type Chat = {
Id : ChatID
Title : string option
Username : ChatID option
AllMembersAreAdmins : bool
/// ...
}
let sendMessage (id:ChatID ) options = () ///http.Call POST


Летучая
26.04.2017
19:54:31
В F# можно как-нибудь получить доступ к this из конструктора типа?

Vasily
26.04.2017
19:57:03
А зачем?

Летучая
26.04.2017
19:57:52
В конструкторе вьюмодели инстанциирую листенер и надо подписать PropertyChanged на его MessageReceived.
В общем-то можно base.OnPropertyChanged, но это как-то аутистично.
Когда есть пропертя.

Vasily
26.04.2017
19:58:19
do
После объявления проперти

Летучая
26.04.2017
19:59:54
let and do bindings must come before member and interface declarations in type definitions

Google

Летучая
26.04.2017
20:00:16
А до он чото всё равно не видит this.
Это баг или фича?

Vasily
26.04.2017
20:04:55
RJl gjrf;b
Код покажи

Летучая
26.04.2017
20:06:57
base тоже запрещает юзать :(

Vasily
26.04.2017
20:07:26
SocketServer на самый верх

Nikolay
26.04.2017
20:07:32
А интерфейсов для записей нет?

Vasily
26.04.2017
20:07:32
do не нужен
Есть просто интерфейсы
И просьба код через pastepin гонять
*pastebin
Со скриншотами херово

Nikolay
26.04.2017
20:09:20
Есть такой аргумент:
InlineKeyboardMarkup or ReplyKeyboardMarkup or ReplyKeyboardRemove or ForceReply
В C# я бы сделал интерфейс IReply и для каждого типа наследовал бы его
Как это в F# сделать лучше?

Vasily
26.04.2017
20:10:00
DU

Летучая
26.04.2017
20:10:25
https://gist.github.com/Worldbeater/b950feadec18c762e680d24256b1a343
Ругается на анекспектед идентифиер ин мембер дефинишон (???)

Nikolay
26.04.2017
20:10:29
type Reply =
| InlineKeyboardMarkup of InlineKeyboardMarkup
| ReplyKeyboardMarkup of ReplyKeyboardMarkup
| ReplyKeyboardRemove of ReplyKeyboardRemove
| ForceReply of ForceReply

Google

Nikolay
26.04.2017
20:10:31
Такой?

Vasily
26.04.2017
20:11:53
socketServer.MessageReceived.Add(fun message ->
sprintf "%s\r\n%s" historyText message
|> fun msg -> base.SetField (&historyText, msg, "HistoryText")
|> ignore)
В самый низ
Base не нужен
Хотя можно просто base выкинуть
Там можно и рекорды пихать и что угодно

Nikolay
26.04.2017
20:13:32
Блин, опять некрасиво получается

Vasily
26.04.2017
20:13:49
Что хочешь сделать-то?

Летучая
26.04.2017
20:13:58

Vasily
26.04.2017
20:14:12
base e,thb
убери

Nikolay
26.04.2017
20:14:53

Летучая
26.04.2017
20:14:55
не влияет аще

Nikolay
26.04.2017
20:15:11
Ну либо возможность передавать записи разных типов в один аргумент
Пойду гуглить короче

Vasily
26.04.2017
20:15:38
&historyText - это шо,
?
Зачем тебе там byref?

Летучая
26.04.2017
20:17:02
Зачем тебе там byref?
type ViewModelBase () =
let propertyChanged = Event<_, _>()
member internal this.OnPropertyChanged (propertyName: string) =
(this, PropertyChangedEventArgs propertyName)
|> propertyChanged.Trigger
member internal this.SetField<'T> (property: byref<'T>, value: 'T, name: string) =
property <- value
this.OnPropertyChanged name
interface INotifyPropertyChanged with
[<CLIEvent>]
member this.PropertyChanged = propertyChanged.Publish
лаконичный SetField от ViewModelBase

Google

Vasily
26.04.2017
20:17:29
Ща

Evgeniy
26.04.2017
20:18:03
@Fuyfuy Привет!

Летучая
26.04.2017
20:18:05
Кароч чот не хочет он давать доступ к пропертям в конструкторе
Ща ещё погуголю

Vasily
26.04.2017
20:18:28
ПОлный код бы

Alexander
26.04.2017
20:18:51
@gsomix привет!

Vasily
26.04.2017
20:19:02
С определением SocketServer и FuncCommand

Летучая
26.04.2017
20:19:48
Он не может перезаписать мьютабл переменную в конструкторе даже (та же ошибка)
Мб я косолапый

Vasily
26.04.2017
20:20:25
МИнуту

Evgeniy
26.04.2017
20:20:34
@Worldbeater https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/members/constructors
> Self Identifiers in Constructors

Летучая
26.04.2017
20:21:02
Спасибо!!!!

Vasily
26.04.2017
20:21:13
type Test() =
let mutable field =""
do
field<-"111"

Evgeniy
26.04.2017
20:21:24
@Worldbeater Да, и про do там тоже почитай.

Vasily
26.04.2017
20:21:43
Ну или as this, конечно

Летучая
26.04.2017
20:23:21
https://gist.github.com/Worldbeater/b950feadec18c762e680d24256b1a343 остановился на таком в общем. спасибо посоны ??

Google

Vasily
26.04.2017
20:25:41
Сам ты посон
Я посоном лет 20 назад был :)

Летучая
26.04.2017
20:36:12
Ой, у меня ещё вопрос, возможно тупой. Есть строка X. С ней надо сделать 2 или более операции (и игнорировать возвращаемые результаты). Есть ли для таких целей сахар по типу пайпов? Типа:
"myString"
=> LogHere
=> LogThere

Evgeniy
26.04.2017
20:39:42
@danslapman Привет!

Daniel
26.04.2017
20:39:54
Привет!

Летучая
26.04.2017
20:40:03
Привет!

Vasily
26.04.2017
20:40:07
[f1;f2]|>Seq.iter (fun x-> x s)

Evgeniy
26.04.2017
20:41:50
@Worldbeater Выше еще советовали ввести функцию tee.
let inline tee fn x = x |> fn |> ignore; x

Летучая
26.04.2017
20:42:34
Спасибо!!

Nikolay
26.04.2017
21:03:32
Выложил своё позорище на гитхаб
https://github.com/Dolfik1/Funogram

Roman
26.04.2017
21:04:45

Nikolay
26.04.2017
21:04:55
Но оно ещё не работает, наверное, не тестил

Roman
26.04.2017
21:06:13
@danslapman @Fuyfuy привет! Расскажите о себе?) есть опыт с f#?

Daniel
26.04.2017
21:10:07
ну что рассказать, около 5 лет писал на .NET, пару лет назад ушёл в Scala (этот чат упоминали в скалачате), F# использую до сих пор для скриптов (не перевариваю питон и всё прочее динамически типизированное)
В бытность дотнетчика запиливал (от отчаяния) PatternMatching на деревьях выражений для C# https://github.com/danslapman/PatternMatching

Roman
26.04.2017
21:11:45