@Fsharp_chat

Страница 35 из 772
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
Или let d= new Dictionary<string,obj?)
Используйте ''' для кода)

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

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
Можно заменить messageId :> obj на box messageId
Посмотрите ещё на upcast. Иногда он позволяет более изящный код.

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?

Nikolay
16.04.2017
10:20:08
Ну по сути да, там Some(null)

Через if then в таком случае делать?

Igor
16.04.2017
10:23:07
Ну по сути да, там Some(null)
По мне так это Some + null - это взаимоисключающие понятия Ты не можешь просто None вернуть?

Nikolay
16.04.2017
10:23:34
Возвращаю не я, а Dapper

С Option удобнее работать, поэтому хочу его использовать

Igor
16.04.2017
10:26:23
С Option удобнее работать, поэтому хочу его использовать
Могу только предложить сделать обертку ( https://fsharpforfunandprofit.com/posts/the-option-type/ ) match x with | null -> None | value -> Some value

Или Option.ofObj и Option.ofNullable

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

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

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