All streams
Search
Write a publication
Pull to refresh
15
0

User

Send message
И в чём тогда преимущества F#, если со львиной долей задач он ничем не поможет?

В смысле? Я чот не понял наверное.
F# как раз поможет со всеми задачами, в которые, например, C# умеет.
И многие решает проще.

Как ФП работает с UI (если работает, конечно)?

Да вот сразу пример (с гифками):
https://github.com/Zaid-Ajaj/tabula-rasa

Но на ООП я смогу сделать и отчет, и поток обработать. А на ФП, выходит, не могу? То есть чтобы создать не консольную программку, а что-то посерьезнее, мне нужно два языка?

А много вы промышленных языков знаете, которые умеют ФП и не умеют ООП или наоборот?

Не совсем 4х, но AI в EU4, пожалуй, лучший в сингл плеер стратегиях.

Лазерные лучи существующей мощности не ведут себя так в вакууме.

Может ещё и Силы не существует? Вздор какой.

там кнопка сверху есть, которая перезапускает страницу, сохраняя прогресс. Мне помогло

Higher-kinded types? Ради интереса, как оно выглядит в C#?

Никак, это фантазии на уровне пропозала. Как и тайп классы.
Даже не факт что рекорды въедут в C#8

Чем дальше тем меньше :)

Рекомендую узнать что значит /s

Очень жаль что русскоязычное комьюнити сильно уступает в адекватности цивилизованным странам.

Очень здорово что вы всё русскоязычное комьюнити назвали нецивилизованным на основании одного спора в интернете.

У Вас странный процессинг. Зачем Вам пункт (6)?

Да, он чисто для UI на клиентах, для данной схемы этот шаг не нужен, хотя в реальности он конечно же происходит. В ядре уже есть инфа о том что ставки остановлены.

Сетевая задержка vs скорость реакции человека. Хз, кто выиграет :).

Вы не поняли.


Чтобы информация о голевом моменте появилась у букмекера необходим такой набор действий (предположим наступает опасный голевой момент, надо инициировать остановку ставок):


1) Скаут на матче сидит с телефоном (планшетом) и тыкает в кнопки, посылая сообщения АГГРЕГАТОРУ данных. Это даже не букмекер. У букмекера есть свои скауты, но их кол-во ничтожно мало по сравнению со скаутами которые есть у агрегаторов.
2) Сообщение идёт по сети (в начале мобильной, т.к. на трибуны никто кабель не проводит, потом по кабелям).
3) Сообщение обрабатывается логикой агрегатора
4) Сообщение по сети отправляется букмекерам
5) Сообщение обрабатывается логикой букмекера
6) Сообщение об остановке ставок отправляется по сети на клиенты (сайт, мобилки и т.п.)


Давайте посчитаем кол-во задержек в этой цепочке
Реакция скаута + Сетевой лаг + Лаг логики (обработка сообщения в системе не мгновенная) + Сетевой лаг + Лаг логики + Сетевой лаг.


Теперь прикинем что надо сделать клиенту букмекера чтобы сделать ставку под гол:
0) Чуть загодя вбить в поля сумму ставки и вид пари
1) Среагировать вовремя
2) Нажать на кнопку


Т.е. просто реакция + сетевой лаг + лаг логики.
Да, у каждого кэфа есть время жизни и он может протухнуть, но я не об этом.


Без особых ухищрений такие ставки бы проходили, т.к. человек на стадионе реагирует КОНЕЧНО же быстрее чем букмекер.

Работали в мякотке, а говорите "даже" про такой высокий коэффициент.

Если степень доверия моим словам зависит от количества нулей в кэфе, то вот вам кэф ДАЖЕ с 10ю нулями!


1.0000000001
Теперь верите что я в мякотке работал?
/s

Спасибо что пытаетесь мне рассказать как там у букмекеров дела идут. Повторюсь я работал в букмекерской компании, прям работал в отделе букмекерского ядра.


Я могу рассказать вам не частные случаи, а общую картину.


Практика:
  1. Достаточно поменять коеффициенты на 20% и у вас уже толпа surebetter-ов развернёт ставки в другую сторону, Вы просто сбалансируетесь с конкурентами.

Такое тоже возможно, но на практике отключают такие исходы. За подтверждением далеко ходить не надо, зайдите под конец матча, где разрыв по счету более 2х очков, на сайт любого букмекера и попробуйте поставить на почти-победителя.


есть толпа фанатов, которые поставят на Спартак при любой ставке.

Это только кажется что это толпа. Основная аудитория букмекера — маргиналы, а в РФ это жители соседних республик. По сравнению с ними фанатов Спартака ничтожно мало. Опять таки, за подтверждением посетите заведение любого букмекера, посмотрите контингент. И если вы думаете что в интернете лучше, то нет.


Для хорошего букмекера это не минус и не банкротство. Это инвестиция.

Минусовые матчи случаются постоянно, да. Если быть наивным букмекером, то они приведут к банкротству. На долгой конечно покрываются статистикой, если букмекер прошаренный.


На практике букмекеры платят (и много) за почти-реалтайм фид.

Опять таки, спасибо что рассказали мне.
Я больше скажу, платят даже за 2 и более чтобы предотвратить риски что один накроется. Даже эти реалтайм фиды (которые идут от скаутах на матчах) не могут быть быстрее (в силу банальной сетевой задержки) чем человек который СИДИТ НА СТАДИОНЕ. Ставки "под гол" идут постоянно.


А ещё кучу денег букмекер делает на неосновных ставках, вроде «кто пробьет следующий угловой»

Это не так. 90% ставок в РФ — футбол. А 90% из них это три вида пари — 1х2, фора и тотал.
Все эти динамические пари они для показухи больше, что букмекер с широкой линией, денег там нет совсем.


Ещё раз спасибо что пытаетесь мне рассказать "как там у букмекеров", но я лучше знаю.

Ничего они не оценивают. Они назначают коэффициенты таким образом, что бы проигравшая сторона полностью оплачивала выигрыш счастливчиков. И себе % конечно же.

Полная чушь. Работал в этой сфере прям в мякотке букмекерства.


Люди заносят на фаворитов.
Возьмём Спартак-Реал. Какой бы кэф вы не поставили на Спартак, сумма денег (плечо) там будет на порядки меньшая чем баблище на Реале (гарантированный выигрыш даже с кэфом 1.1). И занесённые триллионы на Реал надо ОТДАТЬ с кэфом 1.1


Внимание вопрос, где тут выигрыш для букмекера? Ответ скажу за вас — тут чистый минус на грани банкроства.
В реале такие высоковероятные исходы отключают, чтобы выровнять "плечи".


Другой пример: играют Мухосранск-Задрищенск. Вялый матч, никто не может оценить силы этих дворовых команд, поэтому ставите 50/50 с небольшой маржой(т.е. кэфы будут 1.9 у обоих например) и тут внезапно на Мухосранск прилетает ставка в 10 лямов. Ваши действия как букмекера? Правильный ответ — НЕ принимать такую ставку, т.к. это явный договорняк и вы залетите на выплату почти 20 лямов.


Ещё пример. Кто-то сидит на стадионе и получает инфу о голевых моментах раньше логического ядра букмекера. Вот он видит что Месси вышел один на один с вратарём и пробивает. До гола ситуация на поле была равная, шансы на победу каждой команды были допустим тоже 50/50, после гола они очевидно изменятся, поэтому вы можете в последний момент поставить с ОЧЕНЬ выгодным кэфом за момент до его падения.


Короче, ещё многое можно рассказать, а многое не надо. Но главная мысль — не надо путать букмекерство и тотализатор.


В тотализаторе — собрал деньги с народа, выплатил другой половине за минусом маржи. И у нас в РФ тотализатор запрещён.
Чтобы заработать на букмекерстве, где тебя все пытаются обмануть, надо некисло работать с реалтайм данными и менеджментом рисков.

Я не вижу смысла продолжать дискуссию… ответьте, какие из перечисленных Вами языков кроме Haskell компилируются в машинный код и почему все они достаточно маргинальны по сравнению с Go?

Противоречивые параграфы вижу я, но ладно :)


GHC у Хаскеля умеет компилировать как в натив, так и под LLVM
FSC в F# умеет компилировать только под CLR, но есть такая штука как .NET Native, которая сразу полученный код для CLR гонит в натив. Не пользовался за ненадобностью.
В JVM тоже есть способ гнать байткод в натив — Excelsior например.


Не буду скрывать, нативный бинарник Go получится крайне маленьким по размеру по сравнению с любым из вышеперечисленных, но это из-за скудности стандартной либы Go (и это слабо сказано), а не потому что там какие-то ядерные оптимизации происходят.


По поводу маргинальности — PHP и Питон тоже популярнее Haskell, F# и Clojure. Да и вообще всех ФП языков. Возможно даже вместе взятых.


Делает ли это Haskell, F# или Clojure плохими языками? Для тех кто не осилил их освоить — несомненно.

Смешались в кучу кони, люди.


Происходит качественный скачок — появление и позиционирование языка Go для решения этих проблем. Язык заточен исключительно под предметную область: объединяет модель multi-threading и async concurrency — программа запускается в несколько потоков, которые в свою очередь обрабатывают очередь задач (goroutines)

Я понимаю что гоферам застилает глаза божественность Пайка, но неплохо мы обзнакомиться с теорией.


Языки, в которых в самом синтаксисе была селективная асинхронность с синхронным общением между легковесными тредами и корутинами:


  • Concurrent ML + Parallel CML
  • Racket

Не говоря уж у тонне либ для языков:


  • Haskell — дофига. Control.Concurrent.CML хотя бы! Control.Concurrent.CHS туда же.
  • F# — Hopac
  • Clojure — core.async

Не поверите, везде одно и то же — собственный шедулер в юзер спейсе, n:m модель, легковесная абстракция над ОС тредами, синхронное общение (ченелы), селективная асинхронность.


Что нового привнёс Go? Убрал с гоферов необходимость учить Haskell, F# или кложу. Про CML я просто молчу, старый язык уж очень, хотя он до сих пор где-то в продакшне телекома юзается по слухам.

Качественный скачок — новый специализированный язык, поддерживающий многозадачность из коробки.

Поддерживающий только ОДНУ парадигму многозадачности (корутины) из коробки, и оберачивающий весь синтаксис на фоне в монадку Async, чтобы блокирующие вызовы байндились на континуейшн как будто это императивный код.


Любой нормальный язык даст вам на выбор другие парадигмы многозадачности: треды, корутины, фиберы. Монадки конечно же любые на выбор (без дженериков в Го их не сделать, поэтому захардкожена одна), на выбор вытесняющие или кооперативные юзер-спейс планировщики.


Это всё из Го убрали чтобы среднему гоферу не надо было мучаться проблемами выбора.

Для каких-либо других систем (например, для системы типа шарпа) Хиндли-Милнер уже неприменим.

Я не уверен что до конца понимаю почему нормальный вывод типов нельзя подключить к C#


С чего бы вдруг? Там точно так же мог бы быть string иди HurrDurr. То, что должен быть Int32 — вообще ниоткуда не следует. Что будет, если ниже я напишу foo = "fdfdsfd"?

Ну если мы о C#, то да, никак.


А вот тот же H-M алгоритм же с бектреком. Все ограничения от литералов и функций он применяет взад) В этом например отличие алгоритма вывода в Scala от HM, она не умеет пропагировать типы по коду выше.

Нет, конечно, корректный тип в данном случае алгоритмически невыводим (точнее, можно вывести только object или dynamic, что бесполезно).

Бред. Алгоритмически он как раз выводим. Хиндли-Мильнер такое пережовывает на раз. Литерал инта есть? Есть. Значит это Int32.


Даже F# справляется.


Если написать так (аналог default из C#), но не указать тип, то заинферится object (справа, едва заметным серым цветом) и вывалится value restriction:
image


Если добавить присваивание от инта, то естественно алгоритм выведет тип за нас:
image

На нем можно писать как на C#, но приходится это делать явно и не очень удобно.

Лоу левел вещи (unmanaged и ко) действительно писать не так удобно как на C# (но возможно, и даже stackalloc есть, а недавно и Span завезли), но это даже для C# неидеоматичный код так-то! Для любителей поиграться с поинтерами в менеджд языке сойдёт.


А вот обычный ООП код (интерфейсы, пропертя, классы, абстракные фабрики фабрик синглтонов) писать на нём получается короче чем на C#. Потому что возможностей больше. У меня даже примеры есть)

Information

Rating
Does not participate
Registered
Activity