
Evgeniy
29.07.2017
17:31:14
Привет! o/

Igor
29.07.2017
17:31:40
F# не шарю, но интереса ради зашел)

Nikolay
29.07.2017
17:54:39
А есть ещё какие-нибудь F# тусовки, где можно вопрос задать?

Andrey
29.07.2017
17:56:15
stackoverlow

Google

Evgeniy
29.07.2017
18:08:48

Nikolay
29.07.2017
18:12:03
Вот

Evgeniy
29.07.2017
18:12:17
Выше
Я не понял, в чем вопрос. Что ты хочешь сделать?

Nikolay
29.07.2017
18:12:30
http://bugsquash.blogspot.ru/2010/07/abusing-printfformat-in-f.html
Вот ты кидал, помнишь?

Evgeniy
29.07.2017
18:12:39
Да.

Nikolay
29.07.2017
18:13:05
Я хочу сделать вместо такого:
let sqlProcessor (sql: string, values: obj list) : IDataReader =
так:
let sqlProcessor<'a> (sql: string, values: obj list) : 'a =
Но не прокатывает

Evgeniy
29.07.2017
18:14:05
И давай сюда код!

Nikolay
29.07.2017
18:17:37
https://gist.github.com/Dolfik1/7723bdac378968e66982f4eeaa8109c1

Google

Nikolay
29.07.2017
18:18:15
На test2 ругается так:
This expression was expected to have type
'int'
but here has type
'string'
Если местами меняю test1/test2, то ругается на test1 так:
This expression was expected to have type
'string'
but here has type
'int'
И так:
The type 'string' is not compatible with any of the types byte,int16,int32,int64,sbyte,uint16,uint32,uint64,nativeint,unativeint, arising from the use of a printf-style format string
Если убираю 'x, и возвращаю, например, obj, то всё ок

Evgeniy
29.07.2017
18:20:29
Секунду.

Oleg
29.07.2017
18:41:46

Evgeniy
29.07.2017
18:53:20
@Dolfik Интересная задачка, сейчас разберемся. Я только контактную линзу починю.

Vasily
29.07.2017
18:54:47
Ну как бы логично, если внешние данные, то может и null быть

Evgeniy
29.07.2017
19:08:49
@Dolfik А ты хочешь прямо sqlQueryf<type>?

Nikolay
29.07.2017
19:09:05
Ну да
А какое предложение?

Evgeniy
29.07.2017
19:10:19
Если я правильно понимаю, то у тебя не получится так сделать. Или тебе нужно указывать все типы в треугольных скобках, или указывать тип выходного значения.
Нельзя сделать функцию с одним генерик параметром и ожидать, что остальные тоже буду генерик. :)
Предложение такое.
let test1 : SqlQuery<obj> = sqlQueryf "test %i" 42
let test2 : SqlQuery<obj> = sqlQueryf "test %s" "42"

Nikolay
29.07.2017
19:12:42
Чёт как-то не очень

Evgeniy
29.07.2017
19:15:47
Давай думать дальше.

Nikolay
29.07.2017
19:16:03
Я вот не совсем пойму причину

Evgeniy
29.07.2017
19:16:29
Причина простая.
sqlQueryf — это функция от четырех генерик параметров.

Google

Evgeniy
29.07.2017
19:17:29
Ты ее делаешь насильно sqlQuery<'x>, остальные параметры компилятор выводит раз и навсегда при первом вызове.

Nikolay
29.07.2017
19:19:04
По идее можно так сделать:
let t = sql<int> (queryf "test %i" 42)
Но как-то мне кажется не очень

Evgeniy
29.07.2017
19:25:58

Nikolay
29.07.2017
19:29:40
Хм
Можно наверное как-то так сделать:
sqlQeuryf "test %i" 42 |> executeSingle<int>
Ибо у меня там всё равно вызов executeSingle обязателен

Evgeniy
29.07.2017
19:31:56
@Dolfik Просто сноси тогда свои явные генерик параметры, дай поработать компилятору. :)

Nikolay
29.07.2017
19:38:27
Щас попробую
Во, магия:
let dbPerson: Person = sqlQueryf "select * from Persons where Id = %i" person.Id |> executeSingle

Evgeniy
30.07.2017
07:26:37

Vlad
30.07.2017
07:33:19
А что за функция sqlqueryf?

Nikolay
30.07.2017
07:44:03

Friedrich
30.07.2017
07:57:50
А, или тебе там подсунули Some null?

Nikolay
30.07.2017
08:09:41
Чёт я не могу понять, как в .Net Core сделать один NuGet пакет из двух проектов

Friedrich
30.07.2017
08:10:09
А оно само не делает?
Ну, типа, один проект в другом референсишь — и вуаля? Не работает?

Nikolay
30.07.2017
08:10:42
Оно делает, но не пакует в один пакет, а ссылается на другой пакет

Google

Nikolay
30.07.2017
08:11:41
Типа есть два проекта, Natty и Natty.Mapper, если делаю dotnet pack в Netty, то при загрузке его в nuget, он показывает в референсах Natty.Mapper
https://www.nuget.org/packages/Natty/
Вот нашёл issue: https://github.com/NuGet/Home/issues/3891#issuecomment-314894580
Ссылка на коммент, вот я так пробовал, он запаковал Natty.Mapper.dll в пакет, но всё равно в нугете ссылается на него

Evgeniy
31.07.2017
04:00:55
@Dolfik https://github.com/rspeele/rezoom.sql

Nikolay
31.07.2017
06:24:44

Evgeniy
31.07.2017
06:25:08
Библиотека, вместе с Rezoom, выглядит толково. И документация отличная!

Nikolay
31.07.2017
06:29:20
У Sql Provider есть косяки с определением типов, не знаю как у этой

Evgeniy
31.07.2017
06:33:02

Nikolay
31.07.2017
06:34:12
Не видел нигде упоминания других БД

Evgeniy
31.07.2017
06:34:38

Vasily
31.07.2017
08:49:50
Хммм... rezoom смотрится неплохо

Andrew
31.07.2017
10:11:47
Подскажите пожалуйста, как в F# нормально переносить длинные выражения на несколько строчек?
Например, есть вот такое выражение:
let mapping = dict [ for data in xml.Elements (xn "data") -> data.Attribute(xn "name").Value, data.Element(xn "value").Value ]
Я перенес так:
let mapping = dict [
for data in xml.Elements (xn "data") ->
data.Attribute(xn "name").Value,
data.Element(xn "value").Value
]На for компилятор кидает предупреждение - possibly incorrect indentation

Nikolay
31.07.2017
10:14:26

Andrew
31.07.2017
10:14:37
ну а дальше?

Google

Evgeniy
31.07.2017
10:15:17
Привет. o/

Nikolay
31.07.2017
10:15:37
let mapping =
dict [
for data in xml.Elements (xn "data") ->
data.Attribute(xn "name").Value,
data.Element(xn "value").Value
]
Как-то так

Andrew
31.07.2017
10:16:30
Класс, ругаться перестал, и вроде даже примерно понял, почему так стало работать

Nikolay
31.07.2017
10:16:53
Так вроде не прокатит, но можешь попробовать:
let mapping =
dict [
for ...

Evgeniy
31.07.2017
10:18:48

Nikolay
31.07.2017
10:19:45
А можно так сделать:
let mapping =
dict [
xml.Elements (xn "data")
|> Seq.map (fun f ->
f.Attribute(xn "name").Value,
f.Element(xn "value").Value ]

Vasily
31.07.2017
10:20:16
let mapping=xml.Elements (xn "data")|>Seq.map(fun x-?x.Attribute(xn "name").Value,x.Element(xn "value").Value)|>dict

Evgeniy
31.07.2017
10:20:16

Vasily
31.07.2017
10:20:20
Тьфу

Evgeniy
31.07.2017
10:20:28

Nikolay
31.07.2017
10:20:33
Да.
Но тогда отступы получаются громадные

Vasily
31.07.2017
10:20:58
let mapping=xml.Elements (xn "data")|>Seq.map(fun x->(x.Attribute(xn "name").Value,x.Element(xn "value").Value)|>dict

Andrew
31.07.2017
10:21:38

Evgeniy
31.07.2017
10:22:47
Если кому интересно, кстати, рекомендуемый кодстайл.
https://github.com/dungpa/fantomas/blob/master/docs/FormattingConventions.md

Nikolay
31.07.2017
10:22:51
@gsomix а разной длины отступы это по кодстайлу?

Evgeniy
31.07.2017
10:25:13