@Fsharp_chat

Страница 247 из 772
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
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
None действительно преобразуется в null при компиляции, для более простого и понятного интеропа.
Есть неприятная особенность у F#, что в "переменной" типа (SomeType option) может оказаться нулл и это надо проверять отдельно, то есть матчинг с Ноне не сработает. У меня такое было при десериализации с помощью newtonsoft

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

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

Nikolay
30.07.2017
07:44:03
А что за функция sqlqueryf?
Это я свою библиотеку запилил, для работы с БД

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
@Dolfik https://github.com/rspeele/rezoom.sql
Прикольная штука, но под кором не работает

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
https://rspeele.gitbooks.io/rezoom-sql/doc/Language/DataTypes.html
А он кроме sqlite и mssql не поддерживает ничего?

Не видел нигде упоминания других БД

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

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
let mapping = dict [ for data in xml.Elements (xn "data") -> data.Attribute(xn "name").Value, data.Element(xn "value").Value ]
Кодстайл нарушаешь. for должен начинаться на той же строке, что и [.

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
Тьфу

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

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