
Pawel
30.06.2017
19:38:47
@gsomix понятия не имею. но раз в языке этого нет ,а звёзд на гитхабе все 70, то что--то с Fsharpx нет так

Летучая
30.06.2017
19:39:09

Pawel
30.06.2017
19:40:10

Evgeniy
30.06.2017
19:43:54

Google

Evgeniy
30.06.2017
19:46:59
Надо код смотреть и бенчмарки.

Pawel
30.06.2017
19:53:41

Vasily
30.06.2017
20:01:03
Чет подумалось,что можно очередь на структуре типа дерева сделать,только всегда иметь ссылки на первый и последний элемент
В электричку как залезу,попробую код расписать
Только без equatable не взлетит

Roman
30.06.2017
20:06:05

Vasily
30.06.2017
20:08:49
Да не,по факту кортеж из двух ссылок
Ну и счетчик объектов


Pawel
30.06.2017
20:37:45
== List.rev суммарно обработает максимум N элементов.
иными словами "выталкивании" из "очерди" на списках имеет класс сложности O(1)...O(N), а на массивах O(1). В чём же заключается оптимизированность?
== В List.map например гарантированно List.rev вызовится на всех N.
и при чём тут List.map?
== Очередь (как и стек) в ФП решаются прекрасно
если признаком прерасного являются костыли и дополнительный оверхэд, то да
== Я так понимаю, что опыта реализации сего чуда у автора этих строк не было.
let a = ResizeArray<int>() // очередь
a.Insert(0,1) // put
let x = a.[a.Count-1] // pop
a.RemoveAt(a.Count-1)
== Это банально больно, если не иметь соответствующей квалификации
это больно, если мозги отравлены - легко запутаться в вышеприведенном коде.
== Я что-то не припомню, чтобы мои преподы с пеной у рта доказывали, что стеки гавно, массив форевер
Сомнительные авторитеты твои преподы. Насколько я знаю, 90% "преподов" "программирования" - идиоты, 9% - патологические кретины. И то, что они доказывают, вовсе не является аксиомой не зависимо от наличия пены у рта. Если препод не догоняет, что динамический массив - это есть и стек, и очередь - то препод однозначно профнепригоден ))


Klei
01.07.2017
01:09:01
== List.rev суммарно обработает максимум N элементов.
иными словами "выталкивании" из "очерди" на списках имеет класс сложности O(1)...O(N), а на массивах O(1). В чём же заключается оптимизированность?
== В List.map например гарантированно List.rev вызовится на всех N.
и при чём тут List.map?
== Очередь (как и стек) в ФП решаются прекрасно
если признаком прерасного являются костыли и дополнительный оверхэд, то да
== Я так понимаю, что опыта реализации сего чуда у автора этих строк не было.
let a = ResizeArray<int>() // очередь
a.Insert(0,1) // put
let x = a.[a.Count-1] // pop
a.RemoveAt(a.Count-1)
== Это банально больно, если не иметь соответствующей квалификации
это больно, если мозги отравлены - легко запутаться в вышеприведенном коде.
== Я что-то не припомню, чтобы мои преподы с пеной у рта доказывали, что стеки гавно, массив форевер
Сомнительные авторитеты твои преподы. Насколько я знаю, 90% "преподов" "программирования" - идиоты, 9% - патологические кретины. И то, что они доказывают, вовсе не является аксиомой не зависимо от наличия пены у рта. Если препод не догоняет, что динамический массив - это есть и стек, и очередь - то препод однозначно профнепригоден ))
Увидев мое желание прекратить беседу, решил полную чушь протолкнуть?
> иными словами "выталкивании" из "очерди" на списках имеет класс сложности O(1)...O(N), а на массивах O(1). В чём же заключается оптимизированность?
Т.е. то что на массивах добавление элемента имеет O(1..N) тебя не смущает? Оптимизированность в том, что для каждого элемента это происходит не более одного раза в отличии от реализации на массиве, следовательно полное прохождение элемента от начала до конца будет условно стоить O(2), т.е. O(1).
> и при чём тут List.map?
Притом, что при такой трактовке как у тебя им вообще нельзя пользоваться. Ибо там тоже есть List.rev с суммарным объемом в N, т.е. "оверхэд".
> если признаком прерасного являются костыли и дополнительный оверхэд, то да
Костылей ты все еще не показал. Дополнительного оверхэда, кроме, о ужас!, хранения дополнительных ссылок, я пока не увидел.
> let a = ResizeArray<int?) // очередь
> a.Insert(0,1) // put
> let x = a.[a.Count-1] // pop
> a.RemoveAt(a.Count-1)
Ты вообще понял, что написал? Ты в курсе что твой a.Insert(0,1) имеет сложность O(N)? O(N), а не O(1..N)! Это не считая того, что это нихера не иммутабельная структура.
> это больно, если мозги отравлены - легко запутаться в вышеприведенном коде.
Ты умудрился запутаться в вышеприведенном коде. А ты еще ничего иммутабельного не сделал.
> Сомнительные авторитеты твои преподы. Насколько я знаю, 90% "преподов" "программирования" - идиоты, 9% - патологические кретины. И то, что они доказывают, вовсе не является аксиомой не зависимо от наличия пены у рта. Если препод не догоняет, что динамический массив - это есть и стек, и очередь - то препод однозначно профнепригоден ))
В данный момент "патологический кретином" и "идиотом" выставляешь себя ты. То что динамический массив можно юзать как стек и очередь нихрена не значит, что он для этого будет эффективен. Возможно, ты путаешь динамический массив с Deque (хотя почему я должен думать за тебя, если ты даже не потрудился нормально прочитать мои замечания?), которую можно юзать вышеуказанным способом, и которая часто реализуется на динамическом массиве.
1. Динамический массив имеет: O(1..N) за вставку в конец, O(N) за вставку в начале, О(1) за удаление в конце (O(1..N) если экономим память), O(N) за удаление в начале.
2. Двунаправленная очередь на динамическом массиве: O(1..N) за вставку в конец, O(1..N) за вставку в начале, О(1) за удаление в конце (O(1..N) если экономим память), O(1) за удаление в начале (O(1..N) если экономим память).
3. Стек на основе массива: O(1..N) за вставку, O(1) за извлечени.
4. Стек на основе списка: O(1) за вставку, О(1) за извлечение.
5. Очередь на основе массива: O(1..N) за вставку, O(1) за извлечение.
6. Очередь на основе двух стеков (на основе списков): O(1) за вставку, O(1..N) за извлечение, причем из-за "одноразовости" переноса стека для большинства задач считается как O(1). Здесь основная претензия - это размазанность структуры данных по куче, что ввиду ссылочных данных уже не так критично.
Я не знаю, что за универ тебя выпустил, и что за работодатель тебя нанял, но такое незнание матчасти в сочетании с непомерным гонором должны были вывести тебя в маргиналы еще во времена школьной скамьи.
Продолжать дальнейшее обсуждение технической составляющей не буду, ибо с моей точки зрения в данном вопросе ты профан и тебе надо идти на викиконспекты зубрить теорию. Однако, терпеть незаслуженные оскорбления в адрес уважаемых мною людей не собираюсь. У меня есть претензии к современности познаний моих преподов (по прикладным предметам), но уж тот материал, что они дают, они знают на достаточном уровне (разумеется есть исключения).


Friedrich
01.07.2017
03:22:47
Увидев мое желание прекратить беседу, решил полную чушь протолкнуть?
> иными словами "выталкивании" из "очерди" на списках имеет класс сложности O(1)...O(N), а на массивах O(1). В чём же заключается оптимизированность?
Т.е. то что на массивах добавление элемента имеет O(1..N) тебя не смущает? Оптимизированность в том, что для каждого элемента это происходит не более одного раза в отличии от реализации на массиве, следовательно полное прохождение элемента от начала до конца будет условно стоить O(2), т.е. O(1).
> и при чём тут List.map?
Притом, что при такой трактовке как у тебя им вообще нельзя пользоваться. Ибо там тоже есть List.rev с суммарным объемом в N, т.е. "оверхэд".
> если признаком прерасного являются костыли и дополнительный оверхэд, то да
Костылей ты все еще не показал. Дополнительного оверхэда, кроме, о ужас!, хранения дополнительных ссылок, я пока не увидел.
> let a = ResizeArray<int?) // очередь
> a.Insert(0,1) // put
> let x = a.[a.Count-1] // pop
> a.RemoveAt(a.Count-1)
Ты вообще понял, что написал? Ты в курсе что твой a.Insert(0,1) имеет сложность O(N)? O(N), а не O(1..N)! Это не считая того, что это нихера не иммутабельная структура.
> это больно, если мозги отравлены - легко запутаться в вышеприведенном коде.
Ты умудрился запутаться в вышеприведенном коде. А ты еще ничего иммутабельного не сделал.
> Сомнительные авторитеты твои преподы. Насколько я знаю, 90% "преподов" "программирования" - идиоты, 9% - патологические кретины. И то, что они доказывают, вовсе не является аксиомой не зависимо от наличия пены у рта. Если препод не догоняет, что динамический массив - это есть и стек, и очередь - то препод однозначно профнепригоден ))
В данный момент "патологический кретином" и "идиотом" выставляешь себя ты. То что динамический массив можно юзать как стек и очередь нихрена не значит, что он для этого будет эффективен. Возможно, ты путаешь динамический массив с Deque (хотя почему я должен думать за тебя, если ты даже не потрудился нормально прочитать мои замечания?), которую можно юзать вышеуказанным способом, и которая часто реализуется на динамическом массиве.
1. Динамический массив имеет: O(1..N) за вставку в конец, O(N) за вставку в начале, О(1) за удаление в конце (O(1..N) если экономим память), O(N) за удаление в начале.
2. Двунаправленная очередь на динамическом массиве: O(1..N) за вставку в конец, O(1..N) за вставку в начале, О(1) за удаление в конце (O(1..N) если экономим память), O(1) за удаление в начале (O(1..N) если экономим память).
3. Стек на основе массива: O(1..N) за вставку, O(1) за извлечени.
4. Стек на основе списка: O(1) за вставку, О(1) за извлечение.
5. Очередь на основе массива: O(1..N) за вставку, O(1) за извлечение.
6. Очередь на основе двух стеков (на основе списков): O(1) за вставку, O(1..N) за извлечение, причем из-за "одноразовости" переноса стека для большинства задач считается как O(1). Здесь основная претензия - это размазанность структуры данных по куче, что ввиду ссылочных данных уже не так критично.
Я не знаю, что за универ тебя выпустил, и что за работодатель тебя нанял, но такое незнание матчасти в сочетании с непомерным гонором должны были вывести тебя в маргиналы еще во времена школьной скамьи.
Продолжать дальнейшее обсуждение технической составляющей не буду, ибо с моей точки зрения в данном вопросе ты профан и тебе надо идти на викиконспекты зубрить теорию. Однако, терпеть незаслуженные оскорбления в адрес уважаемых мною людей не собираюсь. У меня есть претензии к современности познаний моих преподов (по прикладным предметам), но уж тот материал, что они дают, они знают на достаточном уровне (разумеется есть исключения).
Ребята (к обоим участникам дискуссии), давайте не будем переходить на личности.

Google

Klei
01.07.2017
05:34:33

Pawel
01.07.2017
05:48:11


Friedrich
01.07.2017
05:51:09
== List.rev суммарно обработает максимум N элементов.
иными словами "выталкивании" из "очерди" на списках имеет класс сложности O(1)...O(N), а на массивах O(1). В чём же заключается оптимизированность?
== В List.map например гарантированно List.rev вызовится на всех N.
и при чём тут List.map?
== Очередь (как и стек) в ФП решаются прекрасно
если признаком прерасного являются костыли и дополнительный оверхэд, то да
== Я так понимаю, что опыта реализации сего чуда у автора этих строк не было.
let a = ResizeArray<int>() // очередь
a.Insert(0,1) // put
let x = a.[a.Count-1] // pop
a.RemoveAt(a.Count-1)
== Это банально больно, если не иметь соответствующей квалификации
это больно, если мозги отравлены - легко запутаться в вышеприведенном коде.
== Я что-то не припомню, чтобы мои преподы с пеной у рта доказывали, что стеки гавно, массив форевер
Сомнительные авторитеты твои преподы. Насколько я знаю, 90% "преподов" "программирования" - идиоты, 9% - патологические кретины. И то, что они доказывают, вовсе не является аксиомой не зависимо от наличия пены у рта. Если препод не догоняет, что динамический массив - это есть и стек, и очередь - то препод однозначно профнепригоден ))
> Насколько я знаю, 90% "преподов" "программирования" - идиоты, 9% - патологические кретины.
Вот.
Впрочем, я в дальнейшем обсуждение этой истории лучше буду проводить в привате, если кому-то действительно интересно. Не стоит продолжать разжигать публично.
Всё, я удаляю.
Кто тут взрослый, а кто нет — разбирайтесь приватно.
Посты с оскорблениями трутся, даже если перемешаны с обсуждениями.


Pawel
01.07.2017
05:59:21

Ivan
01.07.2017
06:02:13
Патологический кретинизм - нормальное сосотояние компьютера. Мы вынуждено думаем на его уровне. Так что патологический кретинизм - нормальное состояние хорошего программиста. ?
Коллеги, кто нибудь знает,каково будущее Hopac?


Pawel
01.07.2017
06:12:57
Увидев мое желание прекратить беседу, решил полную чушь протолкнуть?
> иными словами "выталкивании" из "очерди" на списках имеет класс сложности O(1)...O(N), а на массивах O(1). В чём же заключается оптимизированность?
Т.е. то что на массивах добавление элемента имеет O(1..N) тебя не смущает? Оптимизированность в том, что для каждого элемента это происходит не более одного раза в отличии от реализации на массиве, следовательно полное прохождение элемента от начала до конца будет условно стоить O(2), т.е. O(1).
> и при чём тут List.map?
Притом, что при такой трактовке как у тебя им вообще нельзя пользоваться. Ибо там тоже есть List.rev с суммарным объемом в N, т.е. "оверхэд".
> если признаком прерасного являются костыли и дополнительный оверхэд, то да
Костылей ты все еще не показал. Дополнительного оверхэда, кроме, о ужас!, хранения дополнительных ссылок, я пока не увидел.
> let a = ResizeArray<int?) // очередь
> a.Insert(0,1) // put
> let x = a.[a.Count-1] // pop
> a.RemoveAt(a.Count-1)
Ты вообще понял, что написал? Ты в курсе что твой a.Insert(0,1) имеет сложность O(N)? O(N), а не O(1..N)! Это не считая того, что это нихера не иммутабельная структура.
> это больно, если мозги отравлены - легко запутаться в вышеприведенном коде.
Ты умудрился запутаться в вышеприведенном коде. А ты еще ничего иммутабельного не сделал.
> Сомнительные авторитеты твои преподы. Насколько я знаю, 90% "преподов" "программирования" - идиоты, 9% - патологические кретины. И то, что они доказывают, вовсе не является аксиомой не зависимо от наличия пены у рта. Если препод не догоняет, что динамический массив - это есть и стек, и очередь - то препод однозначно профнепригоден ))
В данный момент "патологический кретином" и "идиотом" выставляешь себя ты. То что динамический массив можно юзать как стек и очередь нихрена не значит, что он для этого будет эффективен. Возможно, ты путаешь динамический массив с Deque (хотя почему я должен думать за тебя, если ты даже не потрудился нормально прочитать мои замечания?), которую можно юзать вышеуказанным способом, и которая часто реализуется на динамическом массиве.
1. Динамический массив имеет: O(1..N) за вставку в конец, O(N) за вставку в начале, О(1) за удаление в конце (O(1..N) если экономим память), O(N) за удаление в начале.
2. Двунаправленная очередь на динамическом массиве: O(1..N) за вставку в конец, O(1..N) за вставку в начале, О(1) за удаление в конце (O(1..N) если экономим память), O(1) за удаление в начале (O(1..N) если экономим память).
3. Стек на основе массива: O(1..N) за вставку, O(1) за извлечени.
4. Стек на основе списка: O(1) за вставку, О(1) за извлечение.
5. Очередь на основе массива: O(1..N) за вставку, O(1) за извлечение.
6. Очередь на основе двух стеков (на основе списков): O(1) за вставку, O(1..N) за извлечение, причем из-за "одноразовости" переноса стека для большинства задач считается как O(1). Здесь основная претензия - это размазанность структуры данных по куче, что ввиду ссылочных данных уже не так критично.
Я не знаю, что за универ тебя выпустил, и что за работодатель тебя нанял, но такое незнание матчасти в сочетании с непомерным гонором должны были вывести тебя в маргиналы еще во времена школьной скамьи.
Продолжать дальнейшее обсуждение технической составляющей не буду, ибо с моей точки зрения в данном вопросе ты профан и тебе надо идти на викиконспекты зубрить теорию. Однако, терпеть незаслуженные оскорбления в адрес уважаемых мною людей не собираюсь. У меня есть претензии к современности познаний моих преподов (по прикладным предметам), но уж тот материал, что они дают, они знают на достаточном уровне (разумеется есть исключения).
== на массивах добавление элемента имеет O(1..N)
нет, Ёмкость массива растёт экспоненциально при добавлении, поэтому при добавлении N эллементов требуется перенести всего лишь N * Ln(n), а не каждый раз всё подряд переносить
== Притом, что при такой трактовке как у тебя им вообще нельзя пользоваться. Ибо там тоже есть List.rev с суммарным объемом в N, т.е. "оверхэд"
глупости же. map связан с обходом коллекции и ни какого отношения к добавлению/удалению элементов из неё не имеет. И в массиве сложность обхода O(1), а в списках твоих O(N)
Дальше лень читать. Было бы проще, если бы ты прежде разобрался в том, о чём пыешься спорить.


Friedrich
01.07.2017
06:14:26
По существу дискуссии замечу, кстати, что реализация очереди на двух списках — интересная, но мне кажется, что List.rev там и правда всё порядочно портит. Хотелось бы посмотреть на результаты бенчмарков для такой очереди.


Ivan
01.07.2017
06:16:58
А зачем вообще объединять функциональное программирование с иммутабельностью? Одно другому не мешает ?

Friedrich
01.07.2017
06:17:14
Потому что, ну, мне кажется, что обход массива имеет такую же сложность, как и обход листа. А вот поиск по индексу в листе дороже.

Pawel
01.07.2017
06:17:58

Friedrich
01.07.2017
06:18:11
Ага, с этим соглашусь.
А ещё копирование массива заметно дешевле, чем копирование списка, хотя асимптотика у них, казалось бы, одинаковая.

Google

Ivan
01.07.2017
06:19:12
Скажем так - реально это inplementation detail. При учете кешей процессора и т.д. массив быстрее связгого списка по умолчанию. Но реализацию списка на массивах то же можно сделать.
Не ндо мешать вместе поведение и реализацию. Мы в мире функций. Здесь утка крякает, потому что у нее есть функция кря. А не потому что внутри есть крякалка

Friedrich
01.07.2017
06:21:24
Боюсь, что "реализация списка на массивах" в простом варианте не будет отвечать требованиям к быстродействию (в частности, добавление в начало не будет O(1)). А в продвинутом варианте это уже персистентный вектор — довольно хорошая и практичная вещь, но всё-таки другая.
Кстати, а какие-нибудь современные варианты продвинутых систем типов позволяют предъявлять требования к асимптотике функций?

Ivan
01.07.2017
06:26:16
А это изменит поведение списка для пользователя списка? Если это список - то подменить реализацию не стоит почти ничего. В этом прелесть функционалки. Можно не думать о том как реализована функция, достаточно знать аргумент и результат. И вопрос о родной имплиментации чего бы то ни было вставать не будет. А где в интерфейсе списка есть требования к быстродействию? Вот в реализации связного списка есть констатация достигнутого быстродействия - а это, согласитесь большая разница.

Friedrich
01.07.2017
06:26:33
Передаём привет твоему коту, или кто у тебя там :)
Если б пользователю это никогда не было важно, то не было бы такого ассортимента коллекций.

Ivan
01.07.2017
06:28:45
Так и я о том же. Если мне важно O(1) на втавке - возьму связный. O(1) на индексном доступе - массив - алгоритм работы можно не менять.

Friedrich
01.07.2017
06:29:23
Ну представь, что я делаю какую-то функцию, скажем, бинарного поиска. Принимаю на вход коллекцию и элемент, возвращаю результат поиска. И я хочу (вот прям всерьёз) попросить вызывателя, чтоб у коллекции был поиск по индексу за O(1).
Потому что если там такой асимптотики нету, то и мой поиск им не нужен, пускай используют другой :)

Ivan
01.07.2017
06:29:48
Хеш таблицы

Friedrich
01.07.2017
06:30:34
Или даже я бы хотел свою функцию поиска (уже обобщённую) перегрузить по вот этой асимптотике. Чтобы для O(1) у меня работал бинарный поиск, а для O(N) работал линейный.

Ivan
01.07.2017
06:31:30
Если ты хочешь что то требовать от вызывателя - требуй. Но производительность вызывателя зависит от твоей - так что это проблема вызывателя. Не твоя - абстрагируйся ?
Ты честно можешь сказать что производительность твоего алгоритма есть функция от производительности переданного параметра. И да же расчетную формулу предоставить. А я, пользователб, уже думать буду

Friedrich
01.07.2017
06:36:02

Ivan
01.07.2017
06:36:17
В хелп

Friedrich
01.07.2017
06:36:19
У меня нет формального способа сообщить это пользователю. Коммент только написать.
Но, может, ты и прав. Не думаю, что задача добавления асипмтотик к типам функций очень уж практична.

Ivan
01.07.2017
06:38:36
Пользователь - это тот кто тебя вызывает. Не клиент. У него ктати то же есть требования. Берешь формулу производительности - подставляешь - не удовлетворяет. Ищещь другого производителя ?

Google

Ivan
01.07.2017
06:39:59
А то требования в стиле - хочу феррари - но ездитла чтоб на воде - и чтоб мозеррати на старте делала. И за 2 рубля. Нет? Ну тогда пешком..

Pawel
01.07.2017
06:53:51
Есть куча примеров из жизни, когда ИП нагибает ФП по простоте и производительности одновременно. По мимио очевидных хэш-таблиц и очереди на массивах vs. очереди на списках на вскидку
- сортировка Хоара
- поиск простых чисел методом "решета Эратосфена"
- хранение реактивных данных - функциональный redux тормозной и ужос-ужос, императивный mobx быстрый и простой

Friedrich
01.07.2017
06:59:04
Очередь на Maybe? Это как?

Pawel
01.07.2017
07:00:01
Очередь на Maybe? Это как?
push :: a -> Queue a -> Queue a
push e (Queue inb out) = Queue (e:inb) out
pop :: Queue a -> (Maybe a, Queue a)
pop q =
case top of
Nothing -> (top, emptyQueue)
Just elem -> (Just elem, poppedQueue)
where
(top, q') = peek q
poppedQueue = Queue (inbox q') (tail $ outbox q')
peek :: Queue a -> (Maybe a, Queue a)
peek q@(Queue [] []) = (Nothing, emptyQueue)
peek q@(Queue inb []) = peek $ Queue [] (reverse inb)
peek q@(Queue _ outb) = (Just $ head outb, q)

Roman
01.07.2017
07:00:13

Pawel
01.07.2017
07:00:28

Ivan
01.07.2017
07:04:02
Во! Таки Хаскель! ?

Pawel
01.07.2017
07:04:56

Roman
01.07.2017
07:05:30
субъективно - что?
Оценка субъективна. Забавно, что ты вроде бы довольно умный, но такую простую вещь, как отказаться от оценочных суждений, не можешь.

Friedrich
01.07.2017
07:05:31
Ну то есть Maybe-то там только в возвращаемых типах, чтоб не падало на пустой очереди.

ect"==typeof module.exp
01.07.2017
07:06:29
Уровня SleepSort

Friedrich
01.07.2017
07:06:40

Pawel
01.07.2017
07:07:06

Friedrich
01.07.2017
07:08:35
А в State-монаду там, наверное, пакуется мутабельная реализация?

Pawel
01.07.2017
07:08:39
Монада Satte
type QueueState a = State (Queue a)
pushQueue :: a -> QueueState a ()
pushQueue e = state $ \q -> ((),push e q)
popQueue :: QueueState a (Maybe a)
popQueue = state $ \q -> pop q

Google

Ivan
01.07.2017
07:09:33
Иммутабельная очередь не имеет практического смысла.

Pawel
01.07.2017
07:09:35
впросем там структура данных та же

Roman
01.07.2017
07:11:02

Evgeniy
01.07.2017
08:08:50
https://github.com/fsharp/fslang-suggestions/issues/588
Доброе утро. :)

Kirill
01.07.2017
09:10:27
а разве сейчас это актуально?
в семнадцатой студии относительно работает линтер, который о таких случаях предупреждает. хотя не у всех студия. мне кажется, тут сайм прав

Friedrich
01.07.2017
13:56:36

Roman
01.07.2017
15:59:43
Привет!

Алексей
01.07.2017
17:28:30
Привет :-)

Evgeniy
01.07.2017
19:10:35
First preview of Forge 2.0 (using SDK based templates) available here:
https://github.com/fsharp-editing/Forge/releases/tag/2.0.0-Andromeda

Roman
01.07.2017
19:11:28

Evgeniy
01.07.2017
20:21:15

Igor
01.07.2017
21:05:02
С RabbitMq кто работал? Как вы гоняли DU и records, через сериализировали?

Andrew
01.07.2017
21:10:31
я работал и был тот же вопрос. сейчас дам ссылку