
Dmitry
11.05.2017
10:19:10
и сразу держи структуру типа модифицированого словаря, трекая имеющиеся границы
да-да

Arseniy
11.05.2017
10:28:31
Шаг два - из тех, кто остался, вычленить неполные дубликаты(совпадающие по верхней или нижней границе)
type Item = { upperBound : int; lowerBound : int; name : string }
let items : Item list = []
let dublicates groupKey items =
items
|> Seq.groupBy groupKey
|> Seq.filter (fun (key, xs) -> Seq.length xs > 1)
|> Seq.collect snd
let uppderBoundDublicates = dublicates (fun x -> x.upperBound) items
let lowerBoundDublicates = dublicates (fun x -> x.lowerBound) items
let emptyNames = items |> Seq.filter (fun x -> String.IsNullOrEmpty(x.name))
let anomalies =
Seq.concat [ uppderBoundDublicates; lowerBoundDublicates; emptyNames]
|> Set.ofSeq

Google

Klei
11.05.2017
12:58:22

Vasily
11.05.2017
13:09:20
Я поразмышляю, как это правильно сформулировать
Вчерашний тоже канает
По идее

Arseniy
11.05.2017
13:32:30
ну мне кароче не ясна семантика, если мы выделили дубликаты по обоим границам. то дубликаты по одной границе надо искать только среди оставшихся или, если одна граница совпадает с чем-нибуть из уже выделенных элементов, это считается или нет.

Vasily
11.05.2017
13:32:47
Только среди оставшихся

Arseniy
11.05.2017
13:38:09
ну то есть для
{ upperBound = 5; lowerBound= 0; name = "a" };
{ upperBound = 5; lowerBound= 2; name = "b" };
{ upperBound = 5; lowerBound= 0; name = null };
{ upperBound = 2; lowerBound= 0; name = "c" };
{ upperBound = 9; lowerBound= 1; name = "" };
будет группа дубликатов по двум границам
{ upperBound = 5; lowerBound= 0; name = "a" };
{ upperBound = 5; lowerBound= 0; name = null };
и группа с пустыми именем
{ upperBound = 9; lowerBound= 1; name = "" };
больше никаких аномалий?

Vasily
11.05.2017
13:38:33
Похоже на то

Dmitry
11.05.2017
13:39:39
такой вопрос - есть SqlDataReader, полученный из sqlCommand.ExecuteReader()
из него читают (в C#) как-то так
result = new ...
while (reader.Read()) {
var row = new Row(reader[0], reader[1], reader[2]);
result = result.Add(row);
}
А как это идеоматиески в F# преобразовать?

Pig
11.05.2017
13:40:47
Сначала unfold, потом fold

Roman
11.05.2017
13:41:19
к F# относится только формой, но все же,такой вопрос:
задано рекурентное соотношение:
let rec F (n:uint) = match n with
|0 -> 1
| 1 -> 2
| n -> 3 * F (n -1) - 2 * F (n-2)
задачей было привести это в явный вид т.е. let F n = // тут что-то не рекурсивное решалась задача через понимание того, что F n задает линейное пространство, что действительно так: let isTrue k n= (k * F n) = k * 3 * F (n-1) - k * 2 * F (n-2) где k > 1 и let isTrueAgain = F n + F n = 3 * F (n -1) - 2 * F (n-2) + 3 * F (n -1) - 2 * F (n-2) и т.д. Дальше надо найти базисные вектора данного линенеого пространства и умножить на эти базисные вектора константы, которые тоже нужно найти, задача решаемая, но я тут вычитал, что базисными векторами будут являться геометрические прогрессии. Сам вопрос: где можно найти доказательство того, что вид базисных векторов линейного пространства рекурентных соотношений, будет геометрической прогрессией?


Arseniy
11.05.2017
13:44:59
типо такого
let lazyRows = seq { while(reader.Read()) do yield Row(reader[0], reader[1], reader[2]); }
let rows = List.ofSeq lazyRows

Google

Pig
11.05.2017
13:53:12
let read (r: Reader) =
if r.Read ()
then Some (Row (r.[0], r.[1], r.[2]), r)
else None
let add (acc: ...) (row: Row) = acc.Add row
let foo = Seq.unfold read >> Seq.fold add (new ...)

Evgeniy
11.05.2017
14:03:59
@neftedollar Я не знаком с теорией. Но вот тут, кажется, есть то, что тебя интересует.
http://www.machinelearning.ru/wiki/images/6/6f/C%26LM-DA_5-RS.pdf

Roman
11.05.2017
14:04:38

Evgeniy
11.05.2017
14:14:49
Я тут осознал, что уже давно никакую математику не ботал.
Нехорошо!

Vasily
11.05.2017
14:15:22
Мне больше приходится ботать не математику
А всякую практическую хрень из серии "почему медленно работает"

Roman
11.05.2017
14:17:00

Evgeniy
11.05.2017
14:17:14
Vasily А это тоже интересно. :)

Vasily
11.05.2017
14:26:43
Vasily А это тоже интересно. :)
Ну в целом да. Вот сейчас, например, думаю, как сделать вставку в базу через NHibernate порядка 500к записей, чтобы оно не отрабатывало 20 минут
Кровавый, мать его, энтерпрайз
То же решение на f#

Alexander
11.05.2017
14:29:51
TVP?

Vasily
11.05.2017
14:30:43
Не, там скорее bulk insert

Nikolay
11.05.2017
14:30:52
Да

Friedrich
11.05.2017
14:31:25
Чуваки, вот на этом канале опубликовали кучку докладов про F#!
https://www.youtube.com/channel/UCTdw38Cw6jcm0atBPA39a0Q

Vasily
11.05.2017
14:31:32
То же решение на f# и балк инсертах отрабатывает секунд 10

Google

Nikolay
11.05.2017
14:31:54
Кстати, чем NHibernate лучше EF?

Vasily
11.05.2017
14:32:01
НИЧЕМ

Nikolay
11.05.2017
14:32:14
А зачем тогда его используют?)

Vasily
11.05.2017
14:32:25
Тех, кто его пропагандирует, я лично готов уебать чем-нить тяжелым

Nikolay
11.05.2017
14:32:33
Или это джависты, которые услышали знакомое слово?

Vasily
11.05.2017
14:32:37
Используют в силу инерции
Ну и знакомое слово
Я бы не использовал
Без явной нужды в материализации классов

Nikolay
11.05.2017
14:33:49
Мне чёт хорошо зашёл SQL + Dapper + Slapper

Alexander
11.05.2017
14:36:18

Akhmed
11.05.2017
14:36:21
а в Dapper надо было работать с SQL запросами вроде? Или можно без этого?

Alexander
11.05.2017
14:36:31
но если это одноразовая операция то и балк инсерт пойдет

Nikolay
11.05.2017
14:37:06

Most
11.05.2017
14:37:58
да, даппер хорош
в проде живёт себе и никакой боли)

Evgeniy
11.05.2017
14:38:18
@fvnever Есть что интересное?

Friedrich
11.05.2017
14:38:44
Я дотуда ещё не скоро досмотрю, очередь накопилась. Когда посмотрю — ещё раз вброшу :)

Akhmed
11.05.2017
14:39:46
Может я не прав но даппер это упрощенный ADO.NET ? Если не так уж и много сущностей то еще можно со всем этим добром жить. Но если в проекте несколько сотен сущностей то Dapper по идее будет нехило так напрягать.
Это по сути как руками прописывать сериализацию десериализацию, но в БД

Google

Most
11.05.2017
14:41:55
EF в каком-то смысле тогда тоже "упрощенный ado.net)

Akhmed
11.05.2017
14:42:14
но тот же Code First позволяет не заниматься сериализацией данных )

Friedrich
11.05.2017
14:43:37
У EF очень много особенностей, которые мешают эффективно реализовать некоторые виды запросов.

Nikolay
11.05.2017
14:43:40

Friedrich
11.05.2017
14:43:54
Я вот не далее чем сегодня сравнивал два RowVersion в базе. И, знаете, чуть ажно не офигел.
Вообще через какой-то black duck magic их приходится сравнивать.

Akhmed
11.05.2017
14:44:55
насчет Dapper не скажу - чего не знаю - того не знаю. Но вот уже даже банки есть которые переписывают хранимки на C# с EF
понятно что это не везде возможно и что это добавляет тормозов

Friedrich
11.05.2017
14:45:05
(а ещё сегодня у меня команда полдня потратила на то, чтобы бесконечно мержить EDMX, но это другая история)

Admin
ERROR: S client not available

Akhmed
11.05.2017
14:45:18
но банкам важнее целостность данных нежели скорость выполнения запроса

Nikolay
11.05.2017
14:45:20
Изи
Резолвишь своей версией edmx
А потом обновляешь ручками)

Friedrich
11.05.2017
14:45:58
Это не всегда работает.

Nikolay
11.05.2017
14:46:11
А когда не работает?

Friedrich
11.05.2017
14:46:24
Всякие кастомизации EDMX при этом теряются.
Например, кто-нибудь мог переименовать навигационные поля в модели.
И иногда это нужно!

Google

Nikolay
11.05.2017
14:46:56
Я половину дня трахаюсь с "Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values."
:D

Friedrich
11.05.2017
14:47:18
Представь, что у нас у сущности A есть две ссылки на сущность B:
class A {
B Left {get;set;}
B Right {get;set;}

Nikolay
11.05.2017
14:47:27
И иногда это нужно!
Но вот с этим аккуратно нужно быть, но реально зачастую проще руками поправить, чем мержить едмх

Friedrich
11.05.2017
14:48:09
EDMX по умолчанию при генерёжке обзывает соответствующие коллекции в классе B как As1 и As2.
Ты начинаешь с этим бороться, даёшь им нормальные имена, а потом архаровец стирает EDMX и пересоздаёт.

Nikolay
11.05.2017
14:48:50
:D

Friedrich
11.05.2017
14:48:53
Ой, ладно, простите, это здесь оффтоп.
Я завязываю.
Но, во всяком случае, у меня уже роптания в команде поднимаются — мол, в печку это всё, следующий проект делаем на F# :)

Nikolay
11.05.2017
14:50:18

Friedrich
11.05.2017
14:50:35
(я не вижу, какие конкретные преимущества даст F# при реализации данного вида проектов, но свои возражения держу при себе — пускай распаляются, это к добру)
Хотя есть проект на Mono.

Nikolay
11.05.2017
14:51:25

Friedrich
11.05.2017
14:51:38
Домашние проекты-то я давно портирую на Core.
Кстати, из хороших новостей: они там в 2.0 обещали универсальные линуксовые бинарники.
Так что, наверное, теперь и в арче можно будет пробовать заводить, и в nixos. Нам с @DarkByte2016 будет чем заняться :)

Evgeniy
11.05.2017
15:15:26
@fvnever Отлично! Нужно больше мест, где на F# пишут продакшн.

Igor
11.05.2017
15:31:16
Чья поделка FSharpBot и что он могет?

Летучая
11.05.2017
15:49:05
@Dolfik
Признавайся