
Evgeniy
15.04.2017
16:42:40
Гм.
@fvnever Вот, например, ты.
А, блин, он спит уже, наверное.

Friedrich
15.04.2017
16:49:33
Ну да, похоже, что тут нужен экзистенциальный тип. По такому запросу можно и нагуглить решение.

Google

Friedrich
15.04.2017
16:50:23
Помните, что в F# таких типов нет, так что решение будет наверняка костлявое.

Evgeniy
15.04.2017
16:51:17
@fvnever Я вон нарисовал, как Царьпалис учил!

Friedrich
15.04.2017
16:55:05
Да, я уже посмотрел. Стоит такое делать или нет — зависит от того, какая проблема решается.

Evgeniy
15.04.2017
16:55:26
@Kleidemos ^

Klei
15.04.2017
17:06:00
@Kleidemos ^
Когда я это задумывал, я предполагал нечто вроде
string -> comparison
. То что было предложено, мне в данном конкретном случае точно не подходит.
Но схоронил. Спасибо.

Evgeniy
15.04.2017
17:10:53
@DarkByte2016 Привет.

Илья
15.04.2017
17:11:03
привет

Igor
15.04.2017
17:16:45
Ну шо запилим ссылки из C# <==> F#?

Evgeniy
15.04.2017
17:18:49
@angmarr Ссылки?

Igor
15.04.2017
17:19:10
В описание чата (с C# предложили)
У нас кстати опечатка в описание ? (поправил)

Roman
15.04.2017
17:23:43

Evgeniy
15.04.2017
17:45:50
@Kleidemos Как вариант, конечно, можно сделать
type Projector = string -> IComparable
но тут тоже информация о типах теряется.

Google

Evgeniy
15.04.2017
17:53:25
Ну, и это не тоже самое, что comparison, конечно.

Klei
15.04.2017
17:58:18

Nikolay
15.04.2017
17:59:40
Есть такой C# метод:
AddWithValue(string key, object value)
Как его вызывать в F#? Я так понимаю list.AddWithValue |> "a" "b" - но это не работает

Vasily
15.04.2017
18:00:47
AddWithValue("a","b")

Nikolay
15.04.2017
18:02:08
AddWithValue("a","b")
The result of this expression is implicitly ignored. Consider using 'ignore' to discard this value explicitly, e.g. 'expr |> ignore', or 'let' to bind the result to a name, e.g. 'let result = expr'.
С |> ignore как-то коряво выглядит

Vasily
15.04.2017
18:02:45
Ну можно не писать

Nikolay
15.04.2017
18:03:12
Ну предупреждение не очень красиво выглядит

Vasily
15.04.2017
18:04:58
Возвращаемый метод имеет тип unit просто

Nikolay
15.04.2017
18:05:31
Ладно, попробую обёртку написать

Vasily
15.04.2017
18:05:40
Для игнорирования используется ignore

Nikolay
15.04.2017
18:05:41
Всё равно убого выглядит

Vasily
15.04.2017
18:05:59
На вкус и цвет фломастеры разные, в общем-то

Nikolay
15.04.2017
18:06:38
Ну блин, у меня очень уродливые Insert в бд получаются через ADO.NET

Vasily
15.04.2017
18:06:54
dapper?

Nikolay
15.04.2017
18:07:20
Ну так через dapper вроде вставки не делаются?
Там используется обычный Execute

Vasily
15.04.2017
18:08:39
Ну как бы при использовании низкоуровневых инструментов получается не очень красивый код. Хотя при чем тут ignore, я не понял

Nikolay
15.04.2017
18:09:53
Ну вообще в целом не красиво получается:
command.Parameters.AddWithValue("FirstName", user.FirstName) |> ignore
command.Parameters.AddWithValue("LastName", user.LastName) |> ignore
...

Vasily
15.04.2017
18:10:20
ну враппер напиши

Google

Vasily
15.04.2017
18:11:03
let addParam command param value=commad.Parameters.AddWithValue(param,value)|>ignore
Можно красивее, если command возвращать
Тогда добавление параметров в цепочку пайплайнов уходит

Nikolay
15.04.2017
18:15:01
А как красиво можно сделать что-то типа Dictionary? Чтобы передавать просто key: string, value: object

Vasily
15.04.2017
18:15:36
Разверни суждение, вопроса не поняд

Nikolay
15.04.2017
18:16:39
Ну вот у меня в качестве параметров передаются ключ/значение
Щас
https://gist.github.com/Dolfik1/1253b3bdb7f789d9d4c492aeefbd8b8b
Типа такого набросал
Но оно не работает из-за разных типов видимо
Ну и хотелось бы услышать варианты как это лучше/правильнее сделать можно

Vasily
15.04.2017
18:18:54
param|>Seq.iter (fun x-> addParam command x.Key,x.Value)

Nikolay
15.04.2017
18:19:38
Ну это да, а передачу самой Map
This expression was expected to have type
'int64'
but here has type
'DateTime'

Vasily
15.04.2017
18:20:25
А, эта фигня
Делается через функции
обойти можно через Dictionary<string,obj>
Map немного не для того

Klei
15.04.2017
18:22:42
Тогда уж IDictionary.

Vasily
15.04.2017
18:23:04
Ну можно и так

Google

Klei
15.04.2017
18:25:45
+ Если обращение позволяет вывести тип, проще передавать
(string * obj) list
.

Vasily
15.04.2017
18:26:39
seq

Nikolay
15.04.2017
18:32:00
С Dictionary получается так:
dict ["TelegramMessageId", messageId :> obj; "Message", messageText :> obj; "Date", messageDate :> obj; "UserChatUserId", userId :> obj]
Или тут при любых раскладах нужно в obj конвертировать?

Vasily
15.04.2017
18:33:57
При любых
Или let d= new Dictionary<string,obj?)

Evgeniy
15.04.2017
18:34:39
Береги типы смолоду!

Vasily
15.04.2017
18:34:51
d.Add("TelegramMessageId",messageId) etc

Nikolay
15.04.2017
18:35:24
Не, уж лучше :> obj
Пусть будут смайлики в коде

Vasily
15.04.2017
18:36:24
Ну я бы все же упаковал добавление в отдельные функции

Klei
15.04.2017
18:40:54
Можно заменить
messageId :> obj
на
box messageId

Vasily
15.04.2017
18:41:19
messageId|>box :)

Klei
15.04.2017
18:42:20
В этом месте |> не смотрится.

Igor
15.04.2017
18:45:24
@neftedollar сделали ссылки ?

Nikolay
15.04.2017
18:52:20
Ещё тупенький вопрос. Есть функция, возвращающая Option<obj>, если в возвращённом объекте есть значение, нужно вернуть его, иначе вызвать другую функцию, которая уже непосредственно obj вернёт. Можно конечно через if then сделать, но может есть другие варианты?

Klei
15.04.2017
18:53:30
Option.defaultWith

Roman
15.04.2017
18:54:50

Nikolay
15.04.2017
20:26:46
А в F# есть какие-то фишечки для работы со строками? Или только стандартные методы .Net?

Roman
15.04.2017
22:30:54

Google

Klei
16.04.2017
03:35:03

Evgeniy
16.04.2017
05:32:12
@Dolfik Есть набор функций для статически типизированного форматирования строк. Ну, всякие sprintf, bprintf, ksprintf...

Friedrich
16.04.2017
05:50:15

Nikolay
16.04.2017
10:18:17
Есть такой код:
let user = (Repository.getUser data.Connection telegramId)
|> Option.defaultWith (fun x -> Repository.createUser data.Connection bla bla bla)
getUser возвращает Option(null), но defaultWith не вызывается. Или Option(null) не считается за None?

Igor
16.04.2017
10:19:22

Nikolay
16.04.2017
10:20:08
Ну по сути да, там Some(null)
Через if then в таком случае делать?

Igor
16.04.2017
10:23:07

Nikolay
16.04.2017
10:23:34
Возвращаю не я, а Dapper
С Option удобнее работать, поэтому хочу его использовать

Igor
16.04.2017
10:26:23
Или Option.ofObj и Option.ofNullable

Nikolay
16.04.2017
10:28:34
Ну в таком случае получается "The type 'ChatUser' does not have 'null' as a proper value"

Igor
16.04.2017
10:31:12

Nikolay
16.04.2017
10:31:18
Так работает
let SomeNull (x: obj) =
match x with
| null -> None
| value -> Some value
Без типа не захотело
Но это не очень, ибо тогда тип возвращаемый ломается
Покажи код
https://gist.github.com/Dolfik1/e1d2755e924abc332c9e76185a89492a
Проблема по всей видимости в том, что в F# записи не могут быть null