Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 30.01.15 02:43
Оценка: 72 (7) +1
К вопросу о том, что хаскель не нужен и это инструмент для гиков-энтузиастов и никто его в продакшене в здравом уме использовать не будет

Haskell in the Large
(доклад товарища Don Stewart на Google Tech Talk)

http://code.haskell.org/~dons/talks/dons-google-2015-01-27.pdf

пара цитат для затравки:

• Total Haskell code base: >2M lines, >150 contributors (~20 core), >110k commits.
• Haskell code everywhere: real time pricing, risk management, data analysis, regulatory systems, desktop and web GUIs, web services, algo pricing, end-user scripting, and as plugins to C++, Java, C#, Excel.
• Windows, Linux, clusters and grids. On servers and desktops in >30 countries.

GUIs: Generate native Windows WPF GUI or JavaScript app from single Haskell impl.
Bindings: Tons of bindings to external services. Haskell as API glue.

In-house Haskell compiler: `Mu’. One of Lennart’s many Haskell compilers.
• Whole world optimizing compiler.
• Compiles to portable bytecode – same blob runs on Linux or Windows.
• Values, closures, functions can be serialized.


ЗЫ Будем надеяться, что видео тоже выложат
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Haskell нужен! (в Standard Chartered Bank)
От: vsb Казахстан  
Дата: 30.01.15 04:59
Оценка:
Хаскель отличный язык, было бы здорово, если бы он взлетел хотя бы до уровня скалы.
Re: Не верь глазам своим
От: Mamut Швеция http://dmitriid.com
Дата: 30.01.15 10:58
Оценка: 78 (7) +2
J>К вопросу о том, что хаскель не нужен и это инструмент для гиков-энтузиастов и никто его в продакшене в здравом уме использовать не будет

В банках чего только не используют, как ни странно. Но таким презентациям советую не верить ни на грош. Мы тоже такие презентации еще года два тому назад создавали.

Судя по тому, что они написали на нем все, что только можно написать, их база кода — мешанина неуправляемого кода, в котором никто не может разобраться. Поэтому им понадобилось 150 разработчиков (из которых 20 — core). В общем, ровно то, что было/есть у нас в Кларне, только у них Хаскель, а у нас Erlang.


Fast delivery — это тоже в какой-то мере ложь Потому что им нужен delivery просто быстрее, чем в других банках. У нас релизы раз в неделю, все люди из банковской индустрии «как это так? как вы можете так часто релизить, шаманы!»

Самое главное во всей презентации — в самом конце.

And, even if the language has the tools, developers need taste and guidance to use them


Ну, то есть если нет насаждающих это диктаторов, все будет очень, очень плохо (ну, как в Кларне ).

Из того, за что зацепился глаз:


Often working from verbal, ad hoc evolving spec. And at best from informal functional specs.
 Spec often refined/derived based on the Haskell implementation.
o “No plan survives contact with implementation”


Ахахахахаха, то есть мяу. На русский это переводится так: «их база кода — мешанина неуправляемого кода, в котором никто не может разобраться». У нас тут тоже периодически спеки реверс-инжинирят из реализации. Именно потому что "ad-hoc", реализацию пишут быстро «надо вчера» и в компании есть один человек, который знает, как это работает, но он уволился полгода тому назад.

Writing lots of apps; services; libraries in Haskell.


Ну, у нас в нашей системе тоже было все на Erlang'е — от генерации PDF'ов, до роутинга звонков в customer support. В итоге никто не знает, что это, где оно находится, и как оно работает. И надо 150 человек (вместо реально 20), чтобы эти авгиевы конюшни вычистить.

Heavy use of process isolation. Baby Erlang in Haskell.


Ну дык Следствие Армстронга

Old code doesn’t fall apart – large, (very) strongly typed code bases don’t rot.


Это ложь. Потому что требования меняются, люди уходят, и как эта хренотень работает в итоге не знает никто. От того, что оно принимает на вход TContact2 а возвращает TAddress1, легче не становится, потому что половина нового кода использует TContactInfo, и как конвертировать одно в другое не знает никто (а как оно выглядит в базе данных — это еще один отдельный песнь).


Use the machine to... Document the design for later developers

идет вразрез с процитированным выше:

Often working from verbal, ad hoc evolving spec. Spec often refined/derived based on the Haskell implementation.


Если все, что есть по спецификациям, это — код, то все, приплыли. Потому что люди увольняются и забывают, а многие вещи (особенно «это наш главный клиент, для него проводим особую интеграцию») сильно рушат самые внятные представления о том, как система должна работать.

Make wrong code impossible to write


Ахахаха. Из того, что у тебя проверены все типы, никак не следует, что твоя реализация real time pricing или risk management хоть близко похожа на правду.

Strong, expressive types give us machine-checkable, modular software
• APIs become self-describing


Нет, не становятся. Особенно, если тебе сделать несколько разных вызовов подряд. Особенно, как я уже указывал выше, ты не имеешь ни малейшего представления, что делать с API, который требует TContact2 на вход, если у тебя на руках TContactInfo.

Ах, да Я уже умолчу, что когда contact:is_empty(contact:new()) возвращает false (а должен true), от этого не спасают ни системы типов, ни «самописывающиеся API».

Any dev can build systems without worrying about implementation internals.
 Just fit types together


После чего в пятницу вечером сервер ложится и не поднимается, потому что какой-то новичок написал код, позволяющий создавать отчеты о продажах за целый год, что начало поднимать с диска терабайты данных в память. А что? API-вызов всего лишь требует типа TDate



Остальное вполне норм, хотя и в стиле капитана очевидности


dmitriid.comGitHubLinkedIn
Re[2]: Не верь глазам своим
От: LuciferSaratov Россия  
Дата: 30.01.15 11:02
Оценка: +1
Здравствуйте, Mamut, Вы писали:

M>В банках чего только не используют, как ни странно. Но таким презентациям советую не верить ни на грош. Мы тоже такие презентации еще года два тому назад создавали.


этой — можно верить.
я, когда работал в Сингапуре, был знаком с человеком, который как раз на хаскеле в SCB и писал.
ну и да, хорошим спецам по хаскелю и шарящих в предметной области, там были готовы много платить и таких спецов у них был постоянный дефицит.
Re[3]: Не верь глазам своим
От: Mamut Швеция http://dmitriid.com
Дата: 30.01.15 11:09
Оценка:
M>>В банках чего только не используют, как ни странно. Но таким презентациям советую не верить ни на грош. Мы тоже такие презентации еще года два тому назад создавали.

LS>этой — можно верить.

LS>я, когда работал в Сингапуре, был знаком с человеком, который как раз на хаскеле в SCB и писал.
LS>ну и да, хорошим спецам по хаскелю и шарящих в предметной области, там были готовы много платить и таких спецов у них был постоянный дефицит.

Ну, два-три года тому назад нашей тоже можно было верить. И эрлангистов мы набирали тоже Там просто в презентации есть моменты, которые я процитировал, которые ну точь-в-точь копия того, что происходит в Кларне


dmitriid.comGitHubLinkedIn
Re: Haskell нужен! (в Standard Chartered Bank)
От: Wolverrum Ниоткуда  
Дата: 31.01.15 22:30
Оценка:
Здравствуйте, jazzer,

А как эти дифирамьы соотносятся с другим твоим постом
Автор: jazzer
Дата: 30.01.15
?
Re[2]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 01.02.15 04:15
Оценка:
Здравствуйте, Wolverrum, Вы писали:

W>Здравствуйте, jazzer,


W>А как эти дифирамьы соотносятся с другим твоим постом
Автор: jazzer
Дата: 30.01.15
?


А как они должны соотноситься?
Сорри, я не понимаю вопроса.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Haskell нужен! (в Standard Chartered Bank)
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 01.02.15 06:14
Оценка: +2 :)
Здравствуйте, jazzer, Вы писали:

J>К вопросу о том, что хаскель не нужен и это инструмент для гиков-энтузиастов и никто его в продакшене в здравом уме использовать не будет


Это был, есть и будет инструмент для гиков, либо компаний которые могут запросто нанять 200 человек вместо 20 на один и тот же продукт и не заметить этого. Правда, в конце концов, вся эта писанина придет в состояние "говно неподдерживаемое" и после нескольких лет мозгового штурма все же найдется человек, который таки решится предложить начать её переписывать на каком-то более адекватном для продашна языке или хотя бы документировать... Но это будет потом, а пока будут победные крики этих 200 человек, которым и платят хорошо и работать увлекательно
Re[2]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 01.02.15 14:32
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, jazzer, Вы писали:


J>>К вопросу о том, что хаскель не нужен и это инструмент для гиков-энтузиастов и никто его в продакшене в здравом уме использовать не будет


KP>Это был, есть и будет инструмент для гиков, либо компаний которые могут запросто нанять 200 человек вместо 20 на один и тот же продукт и не заметить этого.


Вообще сейчас для банков не самое лучшее время, все пояса затягивают и cost reduction-ом занимаются уже который год. Маловероятно, чтоб в таких условиях кто-то дал согласие на набор 200 человек вместо 20 — это все ж таки десятикратные траты.

KP>Правда, в конце концов, вся эта писанина придет в состояние "говно неподдерживаемое" и после нескольких лет мозгового штурма все же найдется человек, который таки решится предложить начать её переписывать на каком-то более адекватном для продашна языке или хотя бы документировать... Но это будет потом, а пока будут победные крики этих 200 человек, которым и платят хорошо и работать увлекательно


А "в конце концов" — это когда?
Вот сам Don Stewart работает там с 2011 года, Lennart и прочие звезды — с 2008. Или ты о десятках лет говоришь?
Я вот видел проекты, которые превращались в то, что ты сказал, года за два (некоторые — вообще еще до продакшена, и благополучно умирали, не родившись, и слава богу)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Не верь глазам своим
От: jazzer Россия Skype: enerjazzer
Дата: 01.02.15 14:39
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Самое главное во всей презентации — в самом конце.


M>

M>And, even if the language has the tools, developers need taste and guidance to use them

Ну раз это самое главное, то цитируй уж до конца, что ли:

You can write Java in any language


M>Ну, то есть если нет насаждающих это диктаторов, все будет очень, очень плохо (ну, как в Кларне ).


Давай, я сыграю в КО — приведенная цитата верна вообще безотносительно языка.
На коболе/бейсике/подставить-по-вкусу можно писать на любом языке, и именно нужны диктаторы, насаждающие в команде хороший стиль, хорошую архитектуру и прочая.
Иначе да, все будет очень, очень плохо (не знаю, что там в Кларне, но верю на слово)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Не верь глазам своим
От: Mamut Швеция http://dmitriid.com
Дата: 01.02.15 16:56
Оценка:
M>>

M>>And, even if the language has the tools, developers need taste and guidance to use them

J>Ну раз это самое главное, то цитируй уж до конца, что ли:
J>

J>You can write Java in any language


Ну дык У нас пытались Haskell и OCaml на Эрланге писать

M>>Ну, то есть если нет насаждающих это диктаторов, все будет очень, очень плохо (ну, как в Кларне ).


J>Давай, я сыграю в КО — приведенная цитата верна вообще безотносительно языка.

J>На коболе/бейсике/подставить-по-вкусу можно писать на любом языке, и именно нужны диктаторы, насаждающие в команде хороший стиль, хорошую архитектуру и прочая.

Ну, это безусловно. Поэтому я не верю восторженным "you cannot write wrong code" и прочему в таких презентациях.

J>Иначе да, все будет очень, очень плохо (не знаю, что там в Кларне, но верю на слово)


Ну, оно не прямо «ужас-ужас», но за многие куски кода хочется убивать на месте И в первую очередь — всяких «гуру»


dmitriid.comGitHubLinkedIn
Re[4]: Не верь глазам своим
От: jazzer Россия Skype: enerjazzer
Дата: 01.02.15 17:08
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Ну дык У нас пытались Haskell и OCaml на Эрланге писать


Я уж молчу, что на С++ пишут

J>>На коболе/бейсике/подставить-по-вкусу можно писать на любом языке, и именно нужны диктаторы, насаждающие в команде хороший стиль, хорошую архитектуру и прочая.


M>Ну, это безусловно. Поэтому я не верю восторженным "you cannot write wrong code" и прочему в таких презентациях.


А кто сказал, что кобол — это wrong code? Он не wrong, он просто так пахнет
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Haskell нужен! (в Standard Chartered Bank)
От: Константин Россия  
Дата: 01.02.15 19:21
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>К вопросу о том, что хаскель не нужен и это инструмент для гиков-энтузиастов и никто его в продакшене в здравом уме использовать не будет

J>

J>In-house Haskell compiler: `Mu’. One of Lennart’s many Haskell compilers.


Мы совсем-совсем не гики-энтузиасты, но компилятор под себя запилим
Re[3]: Haskell нужен! (в Standard Chartered Bank)
От: Wolverrum Ниоткуда  
Дата: 01.02.15 21:53
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Wolverrum, Вы писали:


W>>Здравствуйте, jazzer,


W>>А как эти дифирамьы соотносятся с другим твоим постом
Автор: jazzer
Дата: 30.01.15
?


J>А как они должны соотноситься?

J>Сорри, я не понимаю вопроса.

Ну как-то выглядит вполне себе противоречиво. Там — ленивость, утечки, рефакторинг кода: все это суть проблемы и попоболь. А тут "все просто работает", "few resources for manual tasks" (явно противоречие с проблемой рефакторинга) etc.
Re[4]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 02.02.15 03:27
Оценка:
Здравствуйте, Wolverrum, Вы писали:

W>Ну как-то выглядит вполне себе противоречиво. Там — ленивость, утечки, рефакторинг кода: все это суть проблемы и попоболь. А тут "все просто работает", "few resources for manual tasks" (явно противоречие с проблемой рефакторинга) etc.


Ничего противоречивого.
Проблема с рефакторингом решается, как выяснилось, очень просто — через специальный режим компилятора, когда проверяется только то, что реально используется, а не всё на свете (примерно как мелкософтовский компилятор С++ не компилирует шаблоны вообще, пока ты их не используешь — даже синтаксис не проверяет).
Проблема с ленивостью решена в Standard Chartered опять же на уровне компилятора фактически отменой оной: Has a few language and runtime customizations: Largely strict(-ish) evaluation strategy (стр. 7 в презентации)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Haskell нужен! (в Standard Chartered Bank)
От: a_g_99 США http://www.hooli.xyz/
Дата: 02.02.15 07:45
Оценка:
Здравствуйте, jazzer, Вы писали:

J>К вопросу о том, что хаскель не нужен и это инструмент для гиков-энтузиастов и никто его в продакшене в здравом уме использовать не будет

Haskell не нужен.
Главная проблема хаскелла и др. подобных языков что он игнорирует сложность. Это нормальный прагматичный подход для практиков. Но увы не лучший.
Лучший подход — создавать такие ЯП и tools которые делают сложные вещи простыми для понимания.
И такие tools существуют.
Re[5]: Haskell нужен! (в Standard Chartered Bank)
От: Wolverrum Ниоткуда  
Дата: 02.02.15 08:06
Оценка:
Здравствуйте, jazzer,

Спасибо, теперь вкурился: банк собственный диалект хаскеля юзает, и его нахваливает.
Re[6]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 02.02.15 08:22
Оценка:
Здравствуйте, Wolverrum, Вы писали:

W>Здравствуйте, jazzer,


W>Спасибо, теперь вкурился: банк собственный диалект хаскеля юзает, и его нахваливает.


Где ты видишь диалект? Там лишь аспекты компиляции подкручены. Это как бэкэнд для любого другого языка — компилироваться в нейтив или в байткод, оптимизировать или нет (ленивость, в принципе, к оптимизации относится, а не к корректности), и т.п. В С/С++ все то же самое.
Изменений языка (что составило бы диалект) я у них не вижу.

ЗЫ Хотя даже если бы и был диалект — он что, перестал быть хаскелем? Это всего лишь будет означать, что есть такой очень полезный Хаскель, который рулит в Standard Chartered — и?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 02.02.15 08:24
Оценка:
Здравствуйте, a_g_99, Вы писали:

__>Главная проблема хаскелла и др. подобных языков что он игнорирует сложность. Это нормальный прагматичный подход для практиков. Но увы не лучший.

__>Лучший подход — создавать такие ЯП и tools которые делают сложные вещи простыми для понимания.
__>И такие tools существуют.

Без детализации звучит как набор баззвордов, сорри.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 02.02.15 08:26
Оценка:
Здравствуйте, Константин, Вы писали:

К>Здравствуйте, jazzer, Вы писали:


J>>К вопросу о том, что хаскель не нужен и это инструмент для гиков-энтузиастов и никто его в продакшене в здравом уме использовать не будет

J>>

J>>In-house Haskell compiler: `Mu’. One of Lennart’s many Haskell compilers.


К>Мы совсем-совсем не гики-энтузиасты, но компилятор под себя запилим


Э-э-э, а какая связь? Айтишники в любой фирме должны быть гиками, иначе нафиг они нужны. Во многих конторах хачат GCC и собирают собственные его билды — и что теперь, С/С++ — для гиков на основании этого?

Мои слова про гиков относились к заказчикам (например, профессор в универе, для которого студент пишет эзотерическое исследование, или посетители конференций по теории типов). Банк в качестве заказчика — очевидно не гик.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Haskell нужен! (в Standard Chartered Bank)
От: a_g_99 США http://www.hooli.xyz/
Дата: 02.02.15 08:43
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Без детализации звучит как набор баззвордов, сорри.


Ок, по другому.

python vs haskell. почему python имеет гораздо большую популярность чем хаскелл, хотя оба языка появились примерно в одно и то же время?
Re[4]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 02.02.15 09:19
Оценка: +1
Здравствуйте, a_g_99, Вы писали:

__>python vs haskell. почему python имеет гораздо большую популярность чем хаскелл, хотя оба языка появились примерно в одно и то же время?


python проще на порядок, его вообще учить не надо, если еще хоть какой-то язык знаешь.

С другой стороны, язык поощряет написание овнокода (как и какой-нть JS или там бейсик), и действительно, овнокода на нем навалом, и все проблемы динамики в полный рост (я помню, был какой-то большой и известный пакет, в котором были внутри синтаксические ошибки. Просто они были под ифом, который у обычных юзеров не срабатывал — а у нас сработал и доставил неимоверно)

языки со статической проверкой типов вообще менее популярны, чем динамические, ибо 95% (с) программистов не хотят удовлетворять компилятор, а хотят *як *як и в продакшен и айда пиво пить, а если че не так — нехай скрэшится.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Haskell нужен! (в Standard Chartered Bank)
От: a_g_99 США http://www.hooli.xyz/
Дата: 02.02.15 09:49
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>python проще на порядок, его вообще учить не надо, если еще хоть какой-то язык знаешь.


Это большое преимущество, вы согласны?

То бишь главное преимущество которое я слышу от хаскелистов на самом деле это "говнокодить на пайтоне каждый сможет, а вот хаскел освоить тяжело. я редкий специалист и буду востребован". Это конечно полное заблуждение.

J>С другой стороны, язык поощряет написание овнокода (как и какой-нть JS или там бейсик), и действительно, овнокода на нем навалом, и все проблемы динамики в полный рост (я помню, был какой-то большой и известный пакет, в котором были внутри синтаксические ошибки. Просто они были под ифом, который у обычных юзеров не срабатывал — а у нас сработал и доставил неимоверно)

Так и здесь хаскелл не нужен. Возьмите скажем любимицу-старушку банков java. Статическая типизация + простота использования. Что там говнокода меньше стало?
Вопрос говнокода — это прежде всего вопрос культуры разработки. Он решается с помощью статического анализа (типа коверити), рефакторинга и правильным построением команды и проекта.
Что есть главный враг говнокода? Это первичная ясность, простота кода, эффективная абстракция от сложной концепции к простым паттернам. Хаскелл не может сделать этого из коробки. Он "витает" в высоком мире трансьюдеров, каррирования и пр. Как результат количество "непонятного"=="говнокода" кода будет существенно выше чем в пайтоне. Другая огромная проблема — мэйнтейнить все это.
Re[5]: Haskell нужен! (в Standard Chartered Bank)
От: Alex912  
Дата: 02.02.15 09:49
Оценка:
Здравствуйте, jazzer, Вы писали:

J>языки со статической проверкой типов вообще менее популярны, чем динамические, ибо 95% (с) программистов не хотят удовлетворять компилятор, а хотят *як *як и в продакшен и айда пиво пить, а если че не так — нехай скрэшится.


Я как — то на haskell решил что-то запилить используя yesod. Так вот некоторые пакеты там выдавали ошибку при сборке, тоже были синтактические ошибки внутри. Те народ вообще даже не запускал то, что напихали в cabal.
Re[6]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 02.02.15 10:52
Оценка: +1
Здравствуйте, a_g_99, Вы писали:

__>Здравствуйте, jazzer, Вы писали:


J>>python проще на порядок, его вообще учить не надо, если еще хоть какой-то язык знаешь.


__>Это большое преимущество, вы согласны?


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

__>То бишь главное преимущество которое я слышу от хаскелистов на самом деле это "говнокодить на пайтоне каждый сможет, а вот хаскел освоить тяжело. я редкий специалист и буду востребован". Это конечно полное заблуждение.


Я такого не видел, хотя верю, что такое встречается (такое везде встречается).
Обычно говорят (из того, что я видел, и помимо стандартных аргументов в пользу статической типизации), что Хаскель (и ФП вообще) как раз облегчает управление сложностью и сложность кода в результате потока изменяющихся требований растет с меньшей скоростью.

J>>С другой стороны, язык поощряет написание овнокода (как и какой-нть JS или там бейсик), и действительно, овнокода на нем навалом, и все проблемы динамики в полный рост (я помню, был какой-то большой и известный пакет, в котором были внутри синтаксические ошибки. Просто они были под ифом, который у обычных юзеров не срабатывал — а у нас сработал и доставил неимоверно)

__>Так и здесь хаскелл не нужен. Возьмите скажем любимицу-старушку банков java. Статическая типизация + простота использования. Что там говнокода меньше стало?
Нет. Наоборот, они именно жабу и упоминают в презентации, это я тут дипломатично на кобол стрелки перевел

__>Вопрос говнокода — это прежде всего вопрос культуры разработки. Он решается с помощью статического анализа (типа коверити), рефакторинга и правильным построением команды и проекта.


Ну вот утверждается, что в ФП все это проще и в каком-то виде из коробки.

__>Что есть главный враг говнокода? Это первичная ясность, простота кода, эффективная абстракция от сложной концепции к простым паттернам. Хаскелл не может сделать этого из коробки.

Вот утверждают, что все ровно наооброт. Что ФП-код гораздо более ясный и прозрачный и гораздо лучше работает в стиле "собрать из крипичиков, и чтоб не макароны получились".

__>Он "витает" в высоком мире трансьюдеров, каррирования и пр. Как результат количество "непонятного"=="говнокода" кода будет существенно выше чем в пайтоне.

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

__>Другая огромная проблема — мэйнтейнить все это.

В смысле набора программеров? Ну да, хаскеллистов меньше, чем джавистов, тут спору нет.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 02.02.15 10:54
Оценка:
Здравствуйте, Alex912, Вы писали:

A>Здравствуйте, jazzer, Вы писали:


J>>языки со статической проверкой типов вообще менее популярны, чем динамические, ибо 95% (с) программистов не хотят удовлетворять компилятор, а хотят *як *як и в продакшен и айда пиво пить, а если че не так — нехай скрэшится.


A>Я как — то на haskell решил что-то запилить используя yesod. Так вот некоторые пакеты там выдавали ошибку при сборке, тоже были синтактические ошибки внутри. Те народ вообще даже не запускал то, что напихали в cabal.


Ну так не собралось же, а не в продакшене навернулось, как в нашем случае. Хотя, конечно, позор.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 02.02.15 12:12
Оценка:
J>языки со статической проверкой типов вообще менее популярны, чем динамические, ибо 95% (с) программистов не хотят удовлетворять компилятор, а хотят *як *як и в продакшен и айда пиво пить, а если че не так — нехай скрэшится.

Ну и потому что проблемы типов обычно — мизерная часть собственно проблем в коде. У нас в команде вот за год появился первый тикет, который напрямую связан с ошибкой типов. Все остальные проблемы — это логика.

Ну и да. Let it crash рулит Его, правда, никто готовить не умеет (мы тоже )


dmitriid.comGitHubLinkedIn
Re[4]: Haskell нужен! (в Standard Chartered Bank)
От: HrorH  
Дата: 02.02.15 15:02
Оценка:
Здравствуйте, a_g_99, Вы писали:

__>python vs haskell. почему python имеет гораздо большую популярность чем хаскелл, хотя оба языка появились примерно в одно и то же время?


Дык Саймон Пейтон Джонс сказал же "avoid success at all costs".
Они не ставили своей целью популярность, скорее наоборот.
Re[5]: Haskell нужен! (в Standard Chartered Bank)
От: nikov США http://www.linkedin.com/in/nikov
Дата: 02.02.15 18:35
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Проблема с рефакторингом решается, как выяснилось, очень просто — через специальный режим компилятора, когда проверяется только то, что реально используется, а не всё на свете


Вот только странно, что авторы доклада этого не знают (или делают вид, что не знают). Хотя у них свой компилятор (и не совсем Хаскелла), и возможно, он этого не умеет.
Re[6]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 02.02.15 18:39
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, jazzer, Вы писали:


J>>Проблема с рефакторингом решается, как выяснилось, очень просто — через специальный режим компилятора, когда проверяется только то, что реально используется, а не всё на свете


N>Вот только странно, что авторы доклада этого не знают (или делают вид, что не знают). Хотя у них свой компилятор (и не совсем Хаскелла), и возможно, он этого не умеет.


Так это разные люди же — те, которые жаловались, и те, которых презентация. Видимо, у тех, которых презентация, никаких проблем с рефакторингом нет, они все знают и считают очевидным
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Haskell нужен! (в Standard Chartered Bank)
От: lazy-cjow-rhrr Россия lj://_lcr_
Дата: 02.02.15 19:40
Оценка: +1
a_g_99,

__>Что есть главный враг говнокода? Это первичная ясность, простота кода, эффективная абстракция от сложной концепции к простым паттернам. Хаскелл не может сделать этого из коробки. Он "витает" в высоком мире трансьюдеров, каррирования и пр. Как результат количество "непонятного"=="говнокода" кода будет существенно выше чем в пайтоне. Другая огромная проблема — мэйнтейнить все это.


Главный враг говнокода — профессионализм. Остальные выводы — ложные, потому что следуют из ложной посылки.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: Haskell нужен! (в Standard Chartered Bank)
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 03.02.15 06:53
Оценка: +3
Здравствуйте, Mamut, Вы писали:

M>Ну и потому что проблемы типов обычно — мизерная часть собственно проблем в коде. У нас в команде вот за год появился первый тикет, который напрямую связан с ошибкой типов. Все остальные проблемы — это логика.


Ну вот сторонники продвинутых (или хотя бы приличных) систем типов как раз и ратуют за смещение этой границы, чтобы как можно больше логики кодировать в типах и проверять компилятором. Средний питонист/джаваскриптер/эрлангист может и не догадывается, что его "проблема в логике" может в другом языке быть проблемой с типами и быть поймана компилятором. Чем меньше твой язык позволяет выразить типами, тем меньше у тебя ошибок с типами и тем больше ошибок "в логике", это естественно.
Re[7]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 10:11
Оценка: +3
M>>Ну и потому что проблемы типов обычно — мизерная часть собственно проблем в коде. У нас в команде вот за год появился первый тикет, который напрямую связан с ошибкой типов. Все остальные проблемы — это логика.

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


А потом дебажить типы, когда логика закодирована неправильно

DM>Средний питонист/джаваскриптер/эрлангист может и не догадывается, что его "проблема в логике" может в другом языке быть проблемой с типами и быть поймана компилятором. Чем меньше твой язык позволяет выразить типами, тем меньше у тебя ошибок с типами и тем больше ошибок "в логике", это естественно.


Действительно, ведь раз логика закодирована типами, она перестает быть логикой, ага, и никогда не может быть неверной.


dmitriid.comGitHubLinkedIn
Re[2]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 03.02.15 10:58
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Хаскель отличный язык, было бы здорово, если бы он взлетел хотя бы до уровня скалы.


А какие есть признаки того, что между хаскелем и скалой в смысле "взлетания" есть какая-то заметная разница?
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[3]: Haskell нужен! (в Standard Chartered Bank)
От: Константин Россия  
Дата: 03.02.15 11:05
Оценка:
Здравствуйте, jazzer, Вы писали:

К>>Мы совсем-совсем не гики-энтузиасты, но компилятор под себя запилим


J>Э-э-э, а какая связь? Айтишники в любой фирме должны быть гиками, иначе нафиг они нужны. Во многих конторах хачат GCC и собирают собственные его билды — и что теперь, С/С++ — для гиков на основании этого?


J>Мои слова про гиков относились к заказчикам (например, профессор в универе, для которого студент пишет эзотерическое исследование, или посетители конференций по теории типов). Банк в качестве заказчика — очевидно не гик.


Пусть не гики. Тем не менее то, что ребята модифицируют под себя компилятор, это отличная антиреклама Haskell'а:
— Неужели, существующие тулы настолько нехороши, что для использования в банковской сфере их нужно улучшать под себя?
— Раз их нужно иногда менять, готова ли наша компания этим заниматься?

P.S. в период увлечения Emacs'ом я понял, что меня "прёт" от допиливания его под себя. Работа при этом страдает.
Re[8]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 03.02.15 11:10
Оценка: +1
Здравствуйте, Mamut, Вы писали:

M>А потом дебажить типы, когда логика закодирована неправильно


Для типов есть легковесная верификация, в случае их отсутствия не все так радужно.

M>Действительно, ведь раз логика закодирована типами, она перестает быть логикой, ага, и никогда не может быть неверной.


Она не перестает быть логикой, она представляется в форме, которая хорошо подходит для автоматической проверки.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[4]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 03.02.15 11:55
Оценка:
Здравствуйте, Константин, Вы писали:

К>Пусть не гики. Тем не менее то, что ребята модифицируют под себя компилятор, это отличная антиреклама Haskell'а:

А кто сказал, что немодифицированная версия не будет работать? Просто они дозаточили под свои нужды.

К>- Неужели, существующие тулы настолько нехороши, что для использования в банковской сфере их нужно улучшать под себя?

Ну вот, например, компиляция в байткод. Язык не изменился ведь, зато стало можно запускать на любой платформе.
Тот же С++ тоже вполне можно было бы компилять в байткод, если бы компиляторостроители озаботились этим (во всех главных компиляторах есть промежуточное представление, которое почти не зависит от языка и потом просто скармливается бэк-энду). Можно было бы захачить тот же GCC, чтоб он сохранял промежуточный образ в файл, и потом этот файл распространять, чтоб он докомпилировался уже у заказчика на месте.
Причем, насколько я знаю, некоторые конторы GCC таки хачат (не в направлении байткода, а больше на тему кодогенерации, расширений, дополнительных метаданных и т.п.) Тем более что GCC сейчас вообще плагины уже поддерживает, так что заточка еще проще стала. И что, это антиреклама С/С++/что-там-еще-GCC-умеет-собирать?

К>- Раз их нужно иногда менять, готова ли наша компания этим заниматься?

Ну вот компиляторы же все апгрейдят плюсовый/шарповые, и ничего, вроде. Или тоже не готовы? Так на джава-1/С++98/... и сидите? Или новая версия языка или новое расширение компилятора — это антиреклама языку в целом?

К>P.S. в период увлечения Emacs'ом я понял, что меня "прёт" от допиливания его под себя. Работа при этом страдает.

Это ортогонально. Они в компиляторе допилили совершенно конкретные и очень практичные вещи. Типа сериализации функций — круто же: упаковал, послал по сети, на том конце (на другой платформе, может даже) принял, распаковал, запустил, все работает.
Это не просто улучшательства ради улучшательства.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 03.02.15 11:56
Оценка: 23 (3)
Здравствуйте, Константин, Вы писали:

К>Пусть не гики. Тем не менее то, что ребята модифицируют под себя компилятор, это отличная антиреклама Haskell'а:


Они не модифицировали какой-то существующий компилятор. Они написали компилятор хаскелеподобного языка Mu (при условии, что энергичный язык можно считать хаскелеподобным).
Ну и они используют и обычный GHC, Mu у них что-то вроде скрипта для написания бизнес-логики, у него какая-то интеграция с Java/.Net/Excel, но сложно что-то сказать точно — никто за пределами их конторы Mu не видел.

К>- Неужели, существующие тулы настолько нехороши, что для использования в банковской сфере их нужно улучшать под себя?


Существующие в 2008-м году? Серьезно? В этом году для хаскеля даже строк нормальных не было, а массивы нормальные только появились в экспериментальном виде. 2008 год — это GHC 6.8, первый рантайм в котором более-менее SMP работал спустя две версии появился. Да что SMP — тогда с юникодом-то нельзя было стандартными средствами работать.
Вообще, это некоторое упрощение, но можно считать, что то, что сейчас понимается под словом "хаскель" появилось примерно в 2011 году. Хаскель до 2011-го это как C++ времен 80-х годов.
В общем, то, что они что-то там свое начали лепить в 2008 совсем не удивительно. Но, в любом случае, утверждение о том, что они сейчас используют только какой-то свой хаскель с исправленными ошибками не соответствует действительности, или, по крайней мере, не соотвествует тому, что написано в презентации или например тому, что они оплачивали некоторые работы для улучшения у GHC поддержки Windows.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[5]: Haskell нужен! (в Standard Chartered Bank)
От: jazzer Россия Skype: enerjazzer
Дата: 03.02.15 12:05
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, Константин, Вы писали:


К>>Пусть не гики. Тем не менее то, что ребята модифицируют под себя компилятор, это отличная антиреклама Haskell'а:


K>Они не модифицировали какой-то существующий компилятор. Они написали компилятор хаскелеподобного языка Mu (при условии, что энергичный язык можно считать хаскелеподобным).


А почему нельзя? Я так понимаю, отсутствие ленивости только убивает разные бесконечные последовательности, да и то с оговорками, не?
Остальное же все остается — правила вывода, паттерн-матчинг, частичное применение и т.п...
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: Haskell нужен! (в Standard Chartered Bank)
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 03.02.15 12:17
Оценка:
Здравствуйте, Mamut, Вы писали:

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


M>А потом дебажить типы, когда логика закодирована неправильно


Да, а что в этом плохого? Особенно, когда и до дебага-то не доходит, т.к. проблемы уже на стадии компиляции прояаляются.

DM>>Средний питонист/джаваскриптер/эрлангист может и не догадывается, что его "проблема в логике" может в другом языке быть проблемой с типами и быть поймана компилятором. Чем меньше твой язык позволяет выразить типами, тем меньше у тебя ошибок с типами и тем больше ошибок "в логике", это естественно.


M>Действительно, ведь раз логика закодирована типами, она перестает быть логикой, ага, и никогда не может быть неверной.


Зачем клоуна строишь? Ничего подобного я не говорил и не имел в виду.
Re[9]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 12:18
Оценка:
M>>А потом дебажить типы, когда логика закодирована неправильно
K>Для типов есть легковесная верификация, в случае их отсутствия не все так радужно.

Какой-то набор слов.

M>>Действительно, ведь раз логика закодирована типами, она перестает быть логикой, ага, и никогда не может быть неверной.

K>Она не перестает быть логикой, она представляется в форме, которая хорошо подходит для автоматической проверки.

Какой-такой автоматической проверки? У апологетов типов какое-то умопомрачение на типах, честное слово «Как только мы запиливаем логику в типах, она моментально становится правильной и логических ошибок там нет никогда».

Давай, я пример приведу.

Order flow:

1. Создали заказ

2. Опционально обновили заказ (добавили или убрали item'ы)

3. Если заказ expired, можно продлить expiry date

4. Пометили заказ, как отправленный [или]
   пометили лишь некоторые из item'ов в заказе, как отправленные


В 1. заказ может быть создан с оплатой в рассрочку, оплаченный через pre-pay. Если через pre-pay, нужно создать запись, что ожидается оплата от банка (которая придет отдельным банковским файлом в течение недели, а то и больше).

В 2. уменьшать и увеличивать стоимость заказа можно на сумму, зависящую от страны и конфигурации конкретного магазина. Если заказ сделан в системе X, и предоплачен, то повышать сумму заказа нельзя

В 3. expiry date можно перемещать на дни, определенные конфигурацией магазина, и после энного перемещения впаивать магазину штрафы (для этого создается отдельная запись, которая потом выставляется магазину)

В 4. если заказ не предоплачен, то у пользователя начинатеся отсчет времени по рассрочке. При этом если отправлена только часть заказа, то рассрочка начинается только по части заказа, оставшиеся item'ы по сути остаются в состянии 1., и для них продолжают работать все остальные пункты, только в пункте 2. появляется дополнительнео условие: нельзя поднять сумму выше оригинальной суммы заказа (на сконфигурированные суммы) и т.п.


Как это ты все распилишь на типах? И когда распилишь, какого объема будут эти типы, и как их дебажить на предмет логических ошибок?

Ах, да. У нас сейчас задача.

Как сейчас:

1. Если оплата карточкой, мы сразу делаем authorize and capture (резервация денег и снятие со счета)

Как будет:

1. В зависимости от конфигурации магазина мы делаем или authorize and capture или только authorize
2. Если сделан только authorize, мы позволяем повышать сумму заказа даже для товаров, оплаченныз карточкой (зависит от конфигурации магазина)
3. Если заказ expired, мы должны отменить authorization в банке. Если продливается expiry date, мы должны заново сделать auth в банке
4. Если заказ помечен, как отправелнный, и в заказе сделан только auth, то мы должны в этот момент сделать capture

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


dmitriid.comGitHubLinkedIn
Re[9]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 12:20
Оценка:
M>>А потом дебажить типы, когда логика закодирована неправильно
DM>Да, а что в этом плохого? Особенно, когда и до дебага-то не доходит, т.к. проблемы уже на стадии компиляции прояаляются.

С какого перепуга они вылезут на этапе компиляции? Также см. http://rsdn.ru/forum/philosophy/5942556
Автор: Mamut
Дата: 03.02.15


dmitriid.comGitHubLinkedIn
Re[6]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 03.02.15 12:59
Оценка:
Здравствуйте, jazzer, Вы писали:

K>>(при условии, что энергичный язык можно считать хаскелеподобным).


J>А почему нельзя? Я так понимаю, отсутствие ленивости только убивает разные бесконечные последовательности, да и то с оговорками, не?


Дело не в бесконечных структурах. Ленивость — это такая неявная "одноразовая" мутабельность. И если ее полноценной поддержки в языке нет, то нужно использовать гораздо больше явной мутабельности с понятными последствиями, особенно в чистом языке. Это означает что практически весь код будет написан на строгом языке иначе, не важно с бесконечными он структурами работает или конечными, поддержка бесконечных структур это только одно из следствий этого, как и более полезное раннее завершение и прочие вещи для которых в строгом языке придется континьюэйшенами пользоваться, что более чем сомнительное удовольствие.
См. например http://rsdn.ru/forum/decl/4519667.1
Автор: Klapaucius
Дата: 30.11.11


J>Остальное же все остается — правила вывода, паттерн-матчинг, частичное применение и т.п...


Хаскелеподобный язык от эмелеподобного отличается в первую очередь ленивостью и тайпклассами вместо модулей, а не паттерн-матчингом и частичным применением.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[10]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 03.02.15 13:06
Оценка: +1
Здравствуйте, Mamut, Вы писали:

K>>Для типов есть легковесная верификация, в случае их отсутствия не все так радужно.

M>Какой-то набор слов.

Что-то непонятно? Есть какие-то конкретные вопросы?

M>Какой-такой автоматической проверки?


Проверки типов.

M>У апологетов типов какое-то умопомрачение на типах, честное слово


Умопрояснение, скорее.

M> «Как только мы запиливаем логику в типах, она моментально становится правильной и логических ошибок там нет никогда».


Вы случайно запостили в ответ мне отрывок из вашего спора с соломенным человеком.

M>Как именно мне тут помогут типы, если я забуду сделать четвертый пункт?


Поможет тем, что вы можете делать описание чего-то корректным по построению, например. Т.е. сделать нежелательное состояние непредставимым в виде значения.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[9]: Haskell нужен! (в Standard Chartered Bank)
От: AlexRK  
Дата: 03.02.15 13:16
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>>>Средний питонист/джаваскриптер/эрлангист может и не догадывается, что его "проблема в логике" может в другом языке быть проблемой с типами и быть поймана компилятором. Чем меньше твой язык позволяет выразить типами, тем меньше у тебя ошибок с типами и тем больше ошибок "в логике", это естественно.

M>>Действительно, ведь раз логика закодирована типами, она перестает быть логикой, ага, и никогда не может быть неверной.
DM>Зачем клоуна строишь? Ничего подобного я не говорил и не имел в виду.

Вы просто о разных вещах говорите.
"Проблемы в логике" могут быть разными. Могут быть эквивалентны ошибке в программе (тогда они ловятся типами), а могут быть отклонениями программы от спецификации (вместо "+" написали "-").
Re[11]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 13:17
Оценка:
K>Что-то непонятно? Есть какие-то конкретные вопросы?

Да. Ты, правда, решил скипнуть мой пример с вопросом.

M>>Какой-такой автоматической проверки?

K>Проверки типов.

Которая поможет мне с логическими ошибками... как?

M>>Как именно мне тут помогут типы, если я забуду сделать четвертый пункт?

K>Поможет тем, что вы можете делать описание чего-то корректным по построению, например. Т.е. сделать нежелательное состояние непредставимым в виде значения.

Это какие-то общие фразы без конкретики.

Итак, повторю

Как сейчас:

1. Если оплата карточкой, мы сразу делаем authorize and capture (резервация денег и снятие со счета)

Как будет:

1. В зависимости от конфигурации магазина мы делаем или authorize and capture или только authorize
2. Если сделан только authorize, мы позволяем повышать сумму заказа даже для товаров, оплаченныз карточкой (зависит от конфигурации магазина)
3. Если заказ expired, мы должны отменить authorization в банке. Если продливается expiry date, мы должны заново сделать auth в банке
4. Если заказ помечен, как отправелнный, и в заказе сделан только auth, то мы должны в этот момент сделать capture

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


То есть четвертый пункт — это

if is_activated(Order) and is_auth_only(Order):
  do_capture(Order)


Еще раз: как именно типы мне помогут?


dmitriid.comGitHubLinkedIn
Re[12]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 03.02.15 13:45
Оценка:
Здравствуйте, Mamut, Вы писали:

K>>Что-то непонятно? Есть какие-то конкретные вопросы?

M>Да. Ты, правда, решил скипнуть мой пример с вопросом.

Т.е. этот пример был уточняющим вопросом, который поможет вам понять что я имел в виду под "легковесной верификацией"?

K>>Проверки типов.

M>Которая поможет мне с логическими ошибками... как?

Так, что некоторые классы ваших логических ошибок будут приводить к ошибкам компиляции.

K>>Поможет тем, что вы можете делать описание чего-то корректным по построению, например. Т.е. сделать нежелательное состояние непредставимым в виде значения.


M>Это какие-то общие фразы без конкретики.


Ок, с конкретикой: нельзя будет сконструировать заказ с состоянием "Отправленный" и "Непроверенный как написано в 4-м пункте" одновременно, так что в случае забывания 4-го пункта будет ошибка компиляции. Ну, как нельзя забыть проверить значение типа Maybe Foo на пустоту и вызвать функцию bar заданную на Foo, потому что она на Maybe Foo не определена.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[13]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 13:59
Оценка:
M>>Это какие-то общие фразы без конкретики.

K>Ок, с конкретикой: нельзя будет сконструировать заказ с состоянием "Отправленный" и "Непроверенный как написано в 4-м пункте" одновременно, так что в случае забывания 4-го пункта будет ошибка компиляции. Ну, как нельзя забыть проверить значение типа Maybe Foo на пустоту и вызвать функцию bar заданную на Foo, потому что она на Maybe Foo не определена.


Легко предание, да не верится вообще нифига.

Сколько условий «Непроверенный как написано в энном пункте» предлагаешь впихивать в тип?

Каким образом это поможет мне не забыть вписать в тип ошибку «Непроверенный как написано в энном пункте»? <- вот это и есть логическая ошибка, от которой все сказки про типы не спасут

Каким образом это мне поможет на этапе компиляции, если вся информация о заказе идет в рантайме (включая такие прекрасные вещи, как конфигурации десятка параметров из базы данных)?

Ты перенес все эти четыре десятка условий в типы, молодца. Как ты собираешься проверять, что ты эти условия описал в типах логически правильно?


[добавлено потом]

Это я еще умолчал о разных веселых сайд-эффектах:
— отсылать e-mail'ы разных типов при разных действиях
— в зависимости от конфигураций и того, что выбрал пользователь, отсылать бумажные письма
— дергать payments/dunning/bookkeeping за разные части в разные моменты
— вызывать risk check и производить разные действия в зависимости от результата. Не на всех этапах, естественно
— обрабатывать случаи нестандартной интеграции (в основном, для очень больших магазинов)
и еще вагон и маленькая тележка


dmitriid.comGitHubLinkedIn
Отредактировано 03.02.2015 14:21 Mamut [ищите в других сетях] . Предыдущая версия .
Re[10]: Haskell нужен! (в Standard Chartered Bank)
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 03.02.15 14:02
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Вы просто о разных вещах говорите.


Мы просто разные вещи говорим. Он зачем-то додумывает за меня глупости и дописывает, будто я их написал.

ARK>"Проблемы в логике" могут быть разными. Могут быть эквивалентны ошибке в программе (тогда они ловятся типами), а могут быть отклонениями программы от спецификации (вместо "+" написали "-").


Да, могут. Я и не говорю, что проблемы исчезают и "никогда не может быть неверной". Это Мамут зачем-то говорит.
Re[14]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 03.02.15 14:21
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Сколько условий «Непроверенный как написано в энном пункте» предлагаешь впихивать в тип?


Для начала в конструктор значения этого типа.

M>Каким образом это поможет мне не забыть вписать в тип ошибку «Непроверенный как написано в энном пункте»? <- вот это и есть логическая ошибка, от которой все сказки про типы не спасут


Проектируя тип "Заказ", Вы просто описываете вашу спецификацию как конструкторы. Если в спецификации противоречия, вы даже можете их на этом этапе обнаружить. А потом тайпчекер уже заботится о том, что вы все проверяете по спецификации.

M>Каким образом это мне поможет на этапе компиляции, если вся информация о заказе идет в рантайме (включая такие прекрасные вещи, как конфигурации десятка параметров из базы данных)?


Это не является ограничением для статической проверки типов, но тут и этого не требуется.

M>Ты перенес все эти четыре десятка условий в типы, молодца. Как ты собираешься проверять, что ты эти условия описал в типах логически правильно?


Проще искать ошибки с трансляцией спецификации в тип в одном месте, чем с ее выполнением в 1024-х местах в коде.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[15]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 14:24
Оценка:
[я там отредактировал сообщение, добавив еще немного текста]

M>>Сколько условий «Непроверенный как написано в энном пункте» предлагаешь впихивать в тип?

K>Для начала в конструктор значения этого типа.
K>Проектируя тип "Заказ", Вы просто описываете вашу спецификацию как конструкторы. Если в спецификации противоречия, вы даже можете их на этом этапе обнаружить. А потом тайпчекер уже заботится о том, что вы все проверяете по спецификации.

Можно больше конкретики? Я согласен на примеры кода.

M>>Ты перенес все эти четыре десятка условий в типы, молодца. Как ты собираешься проверять, что ты эти условия описал в типах логически правильно?

K>Проще искать ошибки с трансляцией спецификации в тип в одном месте, чем с ее выполнением в 1024-х местах в коде.

Это не ответ на мой вопрос


dmitriid.comGitHubLinkedIn
Re[10]: Haskell нужен! (в Standard Chartered Bank)
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 03.02.15 14:46
Оценка:
Здравствуйте, Mamut, Вы писали:

M>>>А потом дебажить типы, когда логика закодирована неправильно

DM>>Да, а что в этом плохого? Особенно, когда и до дебага-то не доходит, т.к. проблемы уже на стадии компиляции прояаляются.

M>С какого перепуга они вылезут на этапе компиляции?


C такого, что компилятор соответствие типов проверяет. Сделал SQL запрос и ввод от пользователя не строками, а разными типами, и вот уже не получается их так просто в одну строку соединить. В питонах с джаваскриптами это была бы "ошибка в логике", а тут стала ошибкой в типах.
Я не говорю, что абсолютно все проблемы выявляются любой системой статических типов. Лишь некоторые. И чем выразительней эта система и чем удачнее применяется, тем больше проблем выявляется при компиляции.
Re[11]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 14:57
Оценка:
M>>С какого перепуга они вылезут на этапе компиляции?
DM>C такого, что компилятор соответствие типов проверяет. Сделал SQL запрос и ввод от пользователя не строками, а разными типами, и вот уже не получается их так просто в одну строку соединить. В питонах с джаваскриптами это была бы "ошибка в логике", а тут стала ошибкой в типах.

В питонах с джаваскриптами это точно так же была бы проблема с типами, а не с логикой.

DM>Я не говорю, что абсолютно все проблемы выявляются любой системой статических типов. Лишь некоторые. И чем выразительней эта система и чем удачнее применяется, тем больше проблем выявляется при компиляции.


Пока что я про это слышу много сказок и рассказов, никто так конкретного ничего не показал. Более того, никто так и не ответил на банальный вопрос: ну перенесли логику в типы, молодцы. Кто и как будет проверять и дебажить реализацию логики в типах? Ну, весь этот real time pricing или risk management на типах.


dmitriid.comGitHubLinkedIn
Отредактировано 03.02.2015 15:01 Mamut [ищите в других сетях] . Предыдущая версия .
Re: Haskell нужен! (в Standard Chartered Bank)
От: WinnieJayClay Финляндия  
Дата: 03.02.15 15:15
Оценка: +1
J>• Total Haskell code base: >2M lines, >150 contributors (~20 core), >110k commits.

150 контрибуторов это не означает что там столько haskell девелоперов. Хаскель девелоперов там около 10 — все перечисленны в презентации.
Все что они сделали — это просто Haskell DSL и назвали его Mu. Суть в том что в банке трейдеры или риск-аналисты пишут на Мю, это потом копилируется в C++ код и запускается. Я видел некоторые презентации когда этот haskell продвигали и в принципе на месте хаскеля тут мог стоять любой другой DSL язык — такое впечатление сложилось. Потом нужно же чем-то себя занять, они и continuous integration сервер на хаскеле написали и другие тулзы. Поинт в том что сам Хаскель это просто интсрумент, который можно заменить.
Re[12]: Haskell нужен! (в Standard Chartered Bank)
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 03.02.15 17:02
Оценка:
Здравствуйте, Mamut, Вы писали:

M> Более того, никто так и не ответил на банальный вопрос: ну перенесли логику в типы, молодцы. Кто и как будет проверять и дебажить реализацию логики в типах? Ну, весь этот real time pricing или risk management на типах.


Банальный вопрос имеет такой же банальный ответ. Программист будет. Как — имеющимися средствами.
Re[13]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 17:04
Оценка:
M>> Более того, никто так и не ответил на банальный вопрос: ну перенесли логику в типы, молодцы. Кто и как будет проверять и дебажить реализацию логики в типах? Ну, весь этот real time pricing или risk management на типах.

DM>Банальный вопрос имеет такой же банальный ответ. Программист будет. Как — имеющимися средствами.


Можно на примере?

ЗЫ. Вот я не понимаю. Спрашиваешь вопрос про любой язык программирования — тебе и ответят, и примеры покажут, и ссылки подкинут — все, что угодно. Как только дело доходит до апологетов «типы везде, они рулят», все, тишина, одна демагогия на пять страниц ответов


dmitriid.comGitHubLinkedIn
Re: Haskell нужен! (в Standard Chartered Bank)
От: novitk США  
Дата: 03.02.15 17:27
Оценка: +1
Здравствуйте, jazzer, Вы писали:

Сразу оговорюсь, я очень люблю хаскель.

МU, как я понял не хаскель, а понятный простым смертным хаскель-подобный DSL (без ленивости, монад и прочих категорий из теорий).

Попытка не нова, до этого есть/были SecDB, A+, kDB и много всего помельче. Подход имхо малоперспективен. Поддержка полностью своей экосистемы слишком дорога, лучше взять имеющиеся (питон, скалу, возможно .NET в скором будущем) и интегрироваться в нее. Естественно, если у вас есть один или несколько гуру, это может некоторое время летать, но потом они неизбежно уходят и наступает кошмар. Это сейчас понимают даже в SecDB, наиболее успешном и долгоиграющем проекте из подобных (ты же вроде в голдмане?).
Re[12]: Haskell нужен! (в Standard Chartered Bank)
От: lazy-cjow-rhrr Россия lj://_lcr_
Дата: 03.02.15 18:05
Оценка:
Mamut,

M>>>С какого перепуга они вылезут на этапе компиляции?

DM>>C такого, что компилятор соответствие типов проверяет. Сделал SQL запрос и ввод от пользователя не строками, а разными типами, и вот уже не получается их так просто в одну строку соединить. В питонах с джаваскриптами это была бы "ошибка в логике", а тут стала ошибкой в типах.

M>В питонах с джаваскриптами это точно так же была бы проблема с типами, а не с логикой.


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

DM>>Я не говорю, что абсолютно все проблемы выявляются любой системой статических типов. Лишь некоторые. И чем выразительней эта система и чем удачнее применяется, тем больше проблем выявляется при компиляции.


M>Пока что я про это слышу много сказок и рассказов, никто так конкретного ничего не показал. Более того, никто так и не ответил на банальный вопрос: ну перенесли логику в типы, молодцы. Кто и как будет проверять и дебажить реализацию логики в типах? Ну, весь этот real time pricing или risk management на типах.


(Простите, не Хаскель, а пока Скала )
1. У меня есть функции, одна принимает количество миллисекунд с начала эпохи, вторая — количество миллисекунд с начала дня
def flush(moment: Long) = ???
def analyze(moment: Long) = ???

Я хочу немного подкрутить гайку, и дать всем пользователям моих функций понять, что в первой я жду с начала эпохи, а во второй — с начала дня.
sealed trait Day
sealed trait Epoch
type EpochTime = Long @@ Epoch
type DayTime   = Long @@ Day

def flush(moment: EpochTime) = ???
def analyze(moment: DayTime) = ???

Остаётся поработать над обёрткой вокруг "плоских" апи, и в своём приложении использовать только эти Tagged types (определение @@ искать в scalaz). Аналогично можно (и нужно) различать часы, минуты, килограммы, километры в час и так далее.

2. Известная штука — шаблон Builder — страдает одним недостатком: set-чего-то-там можно забыть сделать. Если мы хотим подкрутить гайку и здесь, то это можно сделать вполне — программа с неправильно инициализированным инстансом просто не скомпилируется:
// наш пользовательский классик, который мы хотим билдить
case class Foo(x: Int, y: String, z: Char)

// HasBuilder[_] из библиотеки shapeless-builder
object Foo extends HasBuilder[Foo] {
  // вспомогательные штука из библиотеки shapeless
  val isoContainer = createIsoContainer(apply _, unapply _)
  val fieldsContainer = createFieldsContainer(X :: Y :: Z :: HNil)

  // параметр x обязательный
  object X extends Param[Int]

  // параметр Y опциональный с дефолтом "5"
  object Y extends OptParam[String]("5")

  // параметр Z опциональный с дефолтом '!'
  object Z extends OptParam[Char]('!')
}

import Foo._
val test = Foo.builder.set(X, 42).set(Z, '+').build()
// здесь test == Foo(42,"5",'+')
// если не сделаем set(X, ...) получим ошибку компиляции


3. В базах данных часто все ключи всех таблиц — лонги, и FK-и тоже ессно лонги. Мы пишем свой Дао, и хотим раз и навсегда решить проблему сравнения несравнимых ключей. Например совершенно бессмыссленно делать сравнение между id в таблице комментов и id в таблице юзеров.
case class CommentRow(id: Option[CommentId], // Option в Slick показывает, что он автоинкрементный
                      text: String,
                      authorId: UserId,
                      date: DateTime)

case class UserRow(id: Option[UserId],
                   email: String,
                   firstName: String,
                   lastName: String)
// И потом в Дао очевидно будет ошибка компиляции, если это будет не UserId
usersDao.findById(userId)


А сколько возможностей открывается с тайпклассами — ммм... Тут как всегда — если появляются средства, появляется и необходимость. Уверен, что в Хаскеле можно то же, что выше и даже лучше. Первое так точно, там newtype из коробки. И да, я не говорю, что с момента, когда мы усилили типы, ошибки у нас исчезнут. Но типичные ошибки задавить типами — вполне можно.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[13]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 19:22
Оценка:
M>>Пока что я про это слышу много сказок и рассказов, никто так конкретного ничего не показал. Более того, никто так и не ответил на банальный вопрос: ну перенесли логику в типы, молодцы. Кто и как будет проверять и дебажить реализацию логики в типах? Ну, весь этот real time pricing или risk management на типах.

LCR>(Простите, не Хаскель, а пока Скала )


И опять ни одного ответа на мои вопросы

Вау. Здесь есть типы, а там типы, а тут еще обертку сделали над базой данных.

ПРЕКРАСНО.

Но вопрос был не об этом.

Тут мне утверждают, что много логики можно уложить в типы, и все будет проверяться компилятором ну вот прямо-таки автоматически. Я даже примеры логики
Автор: Mamut
Дата: 03.02.15
привел
Автор: Mamut
Дата: 03.02.15
с уточнениями
Автор: Mamut
Дата: 03.02.15
уточнениями.

Нет. В ответ «программист будет использовать тулзы», «пиши инициализаторы», «а вот тебе примеры, вообще с твоими вопросами несвязанные»

Хотя казалось бы: раз все настолько круто, как вы все это описываете, ведь можно внятно это объяснить и показать ну какой-нибудь простой пример, отвечающий на мой вопрос, не?

Могу повторить вопрос. Простейшие же.

— Вы переносите логику из кода приложения в типы. Это не делает логику правильной, это делает логику в типах. Как вы собираетесь проверять и дебажить логику в типах?

— Как вы перенесете в типы логику, которая зависит от десятка разнообразных действий, включая интересные сайд-эффекты?


LCR>А сколько возможностей открывается с тайпклассами — ммм... Тут как всегда — если появляются средства, появляется и необходимость. Уверен, что в Хаскеле можно то же, что выше и даже лучше. Первое так точно, там newtype из коробки. И да, я не говорю, что с момента, когда мы усилили типы, ошибки у нас исчезнут. Но типичные ошибки задавить типами — вполне можно.


«Сколько возможностей», «типичные ошибки», «задавить». Но при этом все равно нет ответов на мои простейшие вопросы


dmitriid.comGitHubLinkedIn
Re[14]: Haskell нужен! (в Standard Chartered Bank)
От: novitk США  
Дата: 03.02.15 19:47
Оценка:
Здравствуйте, Mamut, Вы писали:

M>- Вы переносите логику из кода приложения в типы. Это не делает логику правильной, это делает логику в типах. Как вы собираетесь проверять и дебажить логику в типах?

Проверка типов эквивалентна доказательству правильности. Дебажить вообще не нужно, если можно формально доказать правильность. Другое дело, что система типов должна покрывать всю верифицируемую логику, что при существующих инструментах для большинства приложений слишком затратно.

M>- Как вы перенесете в типы логику, которая зависит от десятка разнообразных действий, включая интересные сайд-эффекты?

Сайд-эффекты легко типизируются, см монады. Проблема опять же в слабых средствах, но работы ведутся.
Re[15]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 19:58
Оценка:
M>>- Вы переносите логику из кода приложения в типы. Это не делает логику правильной, это делает логику в типах. Как вы собираетесь проверять и дебажить логику в типах?
N>Проверка типов эквивалентна доказательству правильности. Дебажить вообще не нужно, если можно формально доказать правильность.

О. Опять много умных слов ни о чем.

N>Другое дело, что система типов должна покрывать всю верифицируемую логику, что при существующих инструментах для большинства приложений слишком затратно.


Ну то есть в реальной жизни, особенно там, где, цитирую

Often working from verbal, ad hoc evolving spec. And at best from informal functional specs.

этой верификации не будет никогда.

Так что остается вопрос: как господа-апологеты типов, заявляющие, что «проверка типов эквивалентна доказательству правильности» решают проблему неправильно реализованной логики на типах.

M>>- Как вы перенесете в типы логику, которая зависит от десятка разнообразных действий, включая интересные сайд-эффекты?

N>Сайд-эффекты легко типизируются, см монады. Проблема опять же в слабых средствах, но работы ведутся.

Опять сказки и истории.

То есть, резюмируя:
— как вы дебажите типы? — Не, их дебажить не надо... при выполнении одного сложного и на практике почти нигде не реализуемого условия....
— как вы переносите в типы логику, зависящую от сайд эффектов? — Не, ну ты монады посмотри... хотя средства слабые...



dmitriid.comGitHubLinkedIn
Re[14]: Haskell нужен! (в Standard Chartered Bank)
От: Evgeny.Panasyuk Россия  
Дата: 03.02.15 20:41
Оценка: 34 (1)
Здравствуйте, Mamut, Вы писали:

M>Могу повторить вопрос. Простейшие же.

M>- Вы переносите логику из кода приложения в типы. Это не делает логику правильной, это делает логику в типах. Как вы собираетесь проверять

Compile-time unit-тестами — static_assert'ы на типы-результаты (click); автоматическая проверка того, что неправильный код действительно не компилируется и vice versa (click
Автор: rg45
Дата: 27.09.14
).

M>и дебажить логику в типах?


Например отладочным выводом промежуточных типов.

M>- Как вы перенесете в типы логику, которая зависит от десятка разнообразных действий, включая интересные сайд-эффекты?


При желании всё возможно. Например: сортировка runtime-данных через мемоизацию результатов сравнения в compile-time графе-типе (click
Автор: Кодт
Дата: 20.10.14
). То есть запихнуть много runtime данных (упомянутые тобой конфигурации и т.п.) в тип возможно, но это чревато generated code bloat.
Пытаться же запихнуть всю-всю логику в типы — контрпродуктивно, само собой нужен баланс. Как уже неоднократно отмечали выше — типы помогают обнаруживать только некоторые классы ошибок.
Неплохим примером является кодирование единиц измерения и размерности в тип. Например Mars Climate Orbiter распался в атмосфере Марса из-за того, что разные модули по ошибке использовали разные единицы измерения.
Отредактировано 03.02.2015 20:48 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 03.02.2015 20:45 Evgeny.Panasyuk . Предыдущая версия .
Re[16]: Haskell нужен! (в Standard Chartered Bank)
От: novitk США  
Дата: 03.02.15 20:49
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Often working from verbal, ad hoc evolving spec. And at best from informal functional specs.

M>этой верификации не будет никогда.
Это вообще другая проблема. Формализация "informal functional specs" это из области AI. Система типов тут не поможет.

M>Так что остается вопрос: как господа-апологеты типов, заявляющие, что «проверка типов эквивалентна доказательству правильности» решают проблему неправильно реализованной логики на типах.

Никак. Если понятия "правильно" нет, то и проблемы нет.

M>- как вы дебажите типы? — Не, их дебажить не надо... при выполнении одного сложного и на практике почти нигде не реализуемого условия....

Если нужна полная верификация, то да. Частичная есть почти везде и весьма полезна, например отсутствием необходимостью писать тесты (ака "дебажить") фиксации типов, инициализацию или проверки границ.
Re[15]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 20:54
Оценка:
M>>Могу повторить вопрос. Простейшие же.
M>>- Вы переносите логику из кода приложения в типы. Это не делает логику правильной, это делает логику в типах. Как вы собираетесь проверять

EP>Compile-time unit-тестами — static_assert'ы на типы-результаты (click); автоматическая проверка того, что неправильный код действительно не компилируется и vice versa (click
Автор: rg45
Дата: 27.09.14
).


Ну, это понятно и давно не ново


M>>и дебажить логику в типах?

EP>Например отладочным выводом промежуточных типов.

Ну то есть, по сути, ничем не отличается просто от отладочного вывода в программе, так?

M>>- Как вы перенесете в типы логику, которая зависит от десятка разнообразных действий, включая интересные сайд-эффекты?


EP>При желании всё возможно. Например: сортировка runtime-данных, через мемоизацию в compile-time графе (click
Автор: Кодт
Дата: 20.10.14
). То есть запихнуть много runtime данных (упомянутые тобой конфигурации и т.п.) в тип возможно, но это чревато generated code bloat.


Мемоизация — это тоже не ново, и используется много где. Понятно, что все ненамемоизируешь


EP>Пытаться же запихнуть всю-всю логику в типы — контрпродуктивно, само собой нужен баланс. Как уже неоднократно отмечали выше — типы помогают обнаруживать только некоторые классы ошибок.


Ну, я именно про это изначально и говорил. Тут мне только начали заливать баки, что типами можно практически все — от сложной логики
Автор: Klapaucius
Дата: 03.02.15
до сайд-эффектов
Автор: novitk
Дата: 03.02.15


Ты пока единственный, кто ответил по существу вопроса


EP>Неплохим примером является кодирование единиц измерения и размерности в тип. Например Mars Climate Orbiter распался в атмосфере Марса из-за того, что разные модули по ошибке использовали разные единицы измерения.


Размерность в типе — тоже не ново. Даже в динамических языках такие вещи стараются делать в виде всяких tagged values.


dmitriid.comGitHubLinkedIn
Re[17]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 20:56
Оценка:
Здравствуйте, novitk, Вы писали:

N>Это вообще другая проблема.

N>Никак. Если понятия "правильно" нет, то и проблемы нет.
N>Если нужна полная верификация, то да. Частичная есть почти везде и весьма полезна, например отсутствием необходимостью писать тесты (ака "дебажить") фиксации типов, инициализацию или проверки границ.


Итак, внезапно вернулись на исходные позиции
Автор: Mamut
Дата: 03.02.15


Сказки про супермегатипы, которые позволят и сложную логику абсолютно правильно реализовать, и сайд-эффекты описать оказались только сказками, потому что «вообще другая проблема» и «никак».

А «фиксация типов, инициализация и проверки границ» — это достаточно маленький класс проблем.


dmitriid.comGitHubLinkedIn
Re[18]: Haskell нужен! (в Standard Chartered Bank)
От: novitk США  
Дата: 03.02.15 21:07
Оценка:
Здравствуйте, Mamut, Вы писали:

M>А «фиксация типов, инициализация и проверки границ» — это достаточно маленький класс проблем.

"Маленький" это оценочно. К примеру я работая в системе/банке конкурирующей с Мю/SC предпочел бы слезть с динамики, но нирваны конечно не будет.
Re[15]: Про unit-тесты: quickcheck
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 21:11
Оценка:
M>>- Вы переносите логику из кода приложения в типы. Это не делает логику правильной, это делает логику в типах. Как вы собираетесь проверять

EP>Compile-time unit-тестами — static_assert'ы на типы-результаты (click); автоматическая проверка того, что неправильный код действительно не компилируется и vice versa (click
Автор: rg45
Дата: 27.09.14
).


Кстати, о юнит-тестах. Программисты – ленивые скотины, которые реализуют минимально рабочий минимум, и тесты у них такие же. В итоге все падает из-за того, что не обработан какой-нибудь пограничный случай.

Для этого — http://en.wikipedia.org/wiki/QuickCheck

Для достаточно быстрого введения:

https://www.youtube.com/watch?v=zi0rHwfiX1Q
http://vimeo.com/68331689


dmitriid.comGitHubLinkedIn
Re[19]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 03.02.15 21:16
Оценка:
M>>А «фиксация типов, инициализация и проверки границ» — это достаточно маленький класс проблем.
N>"Маленький" это оценочно. К примеру я работая в системе/банке конкурирующей с Мю/SC предпочел бы слезть с динамики, но нирваны конечно не будет.

ну, у нас Erlang. Как я говорил уже, ошибка типа недавно была первая за год. Именно баги вылазят в логике: типа «забыли отослать письмо», «при переходе заказа из состяния X в состяние Y для системы Z в Германии неправильно высчитывается процент, начисляемый пользователю» и т.п.

Был случай, когда нескольким тысячам заказов был выставлен неверный статус из-за неправильной конфигурации (скажем, вместо 14 дней было поставлено 7 дней).


Как это все можно отловить типами, как мне тут некоторые сказочники рассказывают? Да никак.


dmitriid.comGitHubLinkedIn
Re[16]: Haskell нужен! (в Standard Chartered Bank)
От: Evgeny.Panasyuk Россия  
Дата: 03.02.15 22:33
Оценка:
Здравствуйте, Mamut, Вы писали:

M>>>Могу повторить вопрос. Простейшие же.

M>>>- Вы переносите логику из кода приложения в типы. Это не делает логику правильной, это делает логику в типах. Как вы собираетесь проверять
EP>>Compile-time unit-тестами — static_assert'ы на типы-результаты (click); автоматическая проверка того, что неправильный код действительно не компилируется и vice versa (click
Автор: rg45
Дата: 27.09.14
).

M>Ну, это понятно и давно не ново

На новизну и не претендую — просто одно из средств тестирования "логики на типах".

M>>>и дебажить логику в типах?

EP>>Например отладочным выводом промежуточных типов.
M>Ну то есть, по сути, ничем не отличается просто от отладочного вывода в программе, так?

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

Итого: юнит-тесты "логики на типах" есть, отладочный вывод есть. Этого вполне достаточно.
Бывают даже интерактивные оболочки:


M>>>- Как вы перенесете в типы логику, которая зависит от десятка разнообразных действий, включая интересные сайд-эффекты?

EP>>При желании всё возможно. Например: сортировка runtime-данных, через мемоизацию в compile-time графе (click
Автор: Кодт
Дата: 20.10.14
). То есть запихнуть много runtime данных (упомянутые тобой конфигурации и т.п.) в тип возможно, но это чревато generated code bloat.

M>Мемоизация — это тоже не ново, и используется много где. Понятно, что все ненамемоизируешь

На новизну не претендую. Но всё же подчеркну, что здесь мемоизация в самом типе, а не в переменной / значении_типа.
Результирующий тип зависит от входных значений. А раз есть тип, то можно сделать какие угодно проверки и манипуляции в compile-time (хотя сам тип был получен посредством цепочки runtime-проверок).
Это я всё к тому, что какие угодно динамические конфигурации можно запихнуть в compile-time тип. Другое дело что всё упирается в цену, а-ля generated code-bloat.

EP>>Неплохим примером является кодирование единиц измерения и размерности в тип. Например Mars Climate Orbiter распался в атмосфере Марса из-за того, что разные модули по ошибке использовали разные единицы измерения.

M>Размерность в типе — тоже не ново. Даже в динамических языках такие вещи стараются делать в виде всяких tagged values.

В динамических языках проблема очевидно в том, что не факт что все соответствующие проверки сработают на этапе разработки. Даже имея 100% покрытие тестами всех строчек кода — нет такой гарантии.
Re: Haskell нужен! (в Standard Chartered Bank)
От: Джеффри  
Дата: 03.02.15 22:58
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>Total Haskell code base: >2M lines, >150 contributors (~20 core), >110k commits.

J>Haskell code everywhere: real time pricing, risk management, data analysis, regulatory systems, desktop and web GUIs, web services, algo pricing, end-user scripting, and as plugins to C++, Java, C#, Excel.
J>Windows, Linux, clusters and grids. On servers and desktops in >30 countries.Интересно.

Интересно. Я тоже работаю на один западный инвестиционный банк и у нас тоже построена (строится) примерно такая же инфраструктура с real time pricing, risk management, data analysis, regulatory systems, desktop and web GUIs, web services, algo pricing, end-user scripting, and as plugins to C++, Java, C#, Excel. Правда пока еще она меньшего размера (сколько точно строчек кода не знаю, но думаю, что до 2М еще не дотягиваем), но уже пользуется огромной популярность. И вместо Хаскела мы используем другой скриптовый язык.

И вот мне кажется, что дело здесь не в том, какой язык использовать — Хаскел, Эрланг или что-то еще. А в том, что у бизнес-пользователей подобных компания есть огромная потребность в своего рода DSL, который позволит им писать различные ad-hoc скрипты, what-if сценарии, автоматизировать задачи для больших наборов данных, получать доступ к промежуточным данным расчетов и т.д. Эти люди (аналитики, трейдеры, риск менеджеры) и раньше делали нечто подобное, но использовали для этого различные не очень удобные подручные средства, а-ля Excel таблицы с VB макросами. Появление же firm-wide DSL, которые предоставляет доступ к основным ф-циям их систем, к источникам данным, к библиотекам для финансовых расчетов, реально совершает революцию в их работе. Понятно, что они не хотят изучать С++ или Java, ставить Visual Studio и т.д. Строгий контроль типов им тоже, по большому счету, по барабану. Но вот использовать скриптовый язык для решения повседневных задач, они вполне могут и даже хотят. И чем проще, тем лучше. Чем меньше будет синтаксических наворотов, тем лучше.

Так что я бы переформулировал заголовок не как "Haskell нужен", а как "DSL нужен".
Re[2]: Haskell нужен! (в Standard Chartered Bank)
От: novitk США  
Дата: 03.02.15 23:58
Оценка:
Здравствуйте, Джеффри, Вы писали:

Д>Так что я бы переформулировал заголовок не как "Haskell нужен", а как "DSL нужен".


ИМХО внешний большой DSL на нативной платформе, как Мю, не нужен. Делать отладчик, профайлер, среду, библиотеки/биндинги на каждый чих это очень и очень дорого. Гораздо выгодней взять Питон/Скалу/F# и прикрутить к ним удобную db, реактивность, мемоизацию и CI. Трейдеры и риск менеджеры копаться в коде все равно не будут, но если сделать удобно есть надежда понравиться квантам.
Re[3]: Haskell нужен! (в Standard Chartered Bank)
От: Джеффри  
Дата: 04.02.15 00:30
Оценка:
Здравствуйте, novitk, Вы писали:

N>ИМХО внешний большой DSL на нативной платформе, как Мю, не нужен. Делать отладчик, профайлер, среду, библиотеки/биндинги на каждый чих это очень и очень дорого. Гораздо выгодней взять Питон/Скалу/F# и прикрутить к ним удобную db, реактивность, мемоизацию и CI. Трейдеры и риск менеджеры копаться в коде все равно не будут, но если сделать удобно есть надежда понравиться квантам.


Да, я согласен, это может быть и не полноценный DSL со своим синтаксисом, компилятором и т.д. Главное, что с точки зрения конечного пользователя, это выглядит как DSL. То есть язык, который позволяет ему манипулировать объектами из его предметной области. Минимум — IT-шных штучек, максимум — бизнес-логики.

Что мы сделали — взяли простой скриптовый язык, написали к нему библиотеку с ф-циями специфичными для нашей системы и понятными для пользователей (типа, create_trade, price_trade, add_to_portfolio и т.д.), а также добавили доступ к базе данных. По сути это все — среда и сама библиотека ставится одной MSI-кой, язык сам по себе примитивный, достаточно пары примеров и пользователь уже начинает использовать его сначала в режиме командной строки, а потом и писать свои скрипты. Со временем добавили доступ к другим системам и источникам данных, интеграцию с Excel и т.д.

Самое интересно, что как раз риск менеджеры и трейдеры с огромным энтузиазмом взялись копаться в коде и писать свои скрипты. Кванты в основном задействованы для написания библиотечных ф-ций. А уже комбинируют эти ф-ции в единое целое, как строительные блоки, сами конечные пользователи.
Re[20]: Haskell нужен! (в Standard Chartered Bank)
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 04.02.15 03:03
Оценка: +1
Здравствуйте, Mamut, Вы писали:

M>Как это все можно отловить типами, как мне тут некоторые сказочники рассказывают? Да никак.


Ты завязывай с ветряными мельницами-то. Кто тебе тут обещал "это все отловить"?
Клапауций говорил "некоторые классы ваших логических ошибок".
Я изначально написал "смещение этой границы, чтобы как можно больше логики кодировать в типах", т.е. не всю, а сколько получится.
Re[21]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 08:47
Оценка:
M>>Как это все можно отловить типами, как мне тут некоторые сказочники рассказывают? Да никак.

DM>Ты завязывай с ветряными мельницами-то. Кто тебе тут обещал "это все отловить"?


Ну как. Тот же Клапауций тут вещает про «перенести все в инициализаторы», а novitik расскзаывает, как сайд-эффекты типизируются монадами

DM>Клапауций говорил "некоторые классы ваших логических ошибок".

DM>Я изначально написал "смещение этой границы, чтобы как можно больше логики кодировать в типах", т.е. не всю, а сколько получится.

Ну. Сколько логики ты перенесешь в типы, и как это будет проверяться и дебажиться?

ЗЫ. Это уже какое? пятнадцатое сообщение на тему? и до сих пор ни одного внятного ответа. Ни одного даже мало-мальски внятного примера.

Ну вот вам простейший пример простейшей логики:

- Есть заказ.
- Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа
- Величина, на которую можно увеличить сумму заказа, зависит от:
  - Страны, в которой сделан заказ по конфигурируемому умолчанию
    - для Германии:
      - уменьшить можно на max(10% от оригинальной суммы заказа, 10 евро)
      - увеличить можно на max(10% от оригинальной суммы заказа, 10 евро)
  - Магазина, в котором сделан заказ
    - если конфигурации для магазина нет, берутся умолчания для страны магазина
  - если заказ помечен, как pre-paid, увеличивать сумму нельзя, уменьшать можно
    - уже есть тикет, который позволяет увеличивать сумму заказа для pre-paid
      заказов в зависимости от конфигурации магазина


Просто же. Как можно больше логики можно на типах запрограммировать же.


dmitriid.comGitHubLinkedIn
Re[2]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 08:54
Оценка:
Д>Так что я бы переформулировал заголовок не как "Haskell нужен", а как "DSL нужен".

Не просто DSL, а DSL простой и говорязий со всеми этими аналитиками на одном языке.

А то у нас тут заменили внутренний язык на что-то монструозно javascript-оподобное, но зато с мышкой. Производительность упала раза в четыре


dmitriid.comGitHubLinkedIn
Re[16]: Haskell нужен! (в Standard Chartered Bank)
От: genre Россия  
Дата: 04.02.15 09:44
Оценка: 34 (1)
Здравствуйте, Mamut, Вы писали:


M>Можно больше конкретики? Я согласен на примеры кода.


лично я не любитель подобных техник, но все-таки. гугли например по словам type safe builder pattern. первая же ссылка: https://michid.wordpress.com/2008/08/13/type-safe-builder-pattern-in-java/
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[17]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 10:04
Оценка:
M>>Можно больше конкретики? Я согласен на примеры кода.

G>лично я не любитель подобных техник, но все-таки. гугли например по словам type safe builder pattern. первая же ссылка: https://michid.wordpress.com/2008/08/13/type-safe-builder-pattern-in-java/


Спасибо. Это все равно возвращает к изначальным:
— кто и как будет проверять, правильно ли реализована логика в этих типах
— не впихивать же 40 условий, половина из которых зависит от конфигураций, в эти инициализаторы



dmitriid.comGitHubLinkedIn
Re[18]: Haskell нужен! (в Standard Chartered Bank)
От: genre Россия  
Дата: 04.02.15 10:27
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Спасибо. Это все равно возвращает к изначальным:

M>- кто и как будет проверять, правильно ли реализована логика в этих типах
M>- не впихивать же 40 условий, половина из которых зависит от конфигураций, в эти инициализаторы

1. так же как и раньше, просто некоторая часть ошибок найдется компилятором, а не тестером. те этот механизм ничего конечно не гарантирует, кроме того, что какой-то процент ошибок найдется раньше. так же см пункт 2.
2. ну вот поэтому я и не любитель таких методик, практика показывает, что гораздо быстрее найдется вылетевший NPE, чем ты озверев впихнешь всю бизнес-логику в систему типов. БОлее того, если уж ошибка проскочит компилятор, то найти ее будет сложнее, чем банальный NPE в примере с билдером.

Но принципиально такая возможность существует. Может быть можно даже извернуться и придумать дсл позволяющий реализовывать такие штуки гораздо менее многословно.

PS. немного подумав. и все-таки, для некоторых вещей такие техники вполне имеют смысл, например для каких-то базовых сущностей системы. Например, ордер в торговой системе инварианты которого проверяются компилятором это скорее добро, чем зло, учитывая, что модифицируется он крайне редко и можно потратить силы на систему типов один раз.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[19]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 10:52
Оценка:
M>>Спасибо. Это все равно возвращает к изначальным:
M>>- кто и как будет проверять, правильно ли реализована логика в этих типах
M>>- не впихивать же 40 условий, половина из которых зависит от конфигураций, в эти инициализаторы

G>1. так же как и раньше,


Как? Ну то есть все те же юнит-тесты и отладочная печать? Тогда это совсем не отличается от обычной работы в любом языке программирования, даже насквозь динамическом

G>просто некоторая часть ошибок найдется компилятором, а не тестером.


Какая часть?

G>те этот механизм ничего конечно не гарантирует, кроме того, что какой-то процент ошибок найдется раньше. так же см пункт 2.

G>2. ну вот поэтому я и не любитель таких методик, практика показывает, что гораздо быстрее найдется вылетевший NPE, чем ты озверев впихнешь всю бизнес-логику в систему типов. БОлее того, если уж ошибка проскочит компилятор, то найти ее будет сложнее, чем банальный NPE в примере с билдером.

:D Вот я как бы к этому веду и намекаю

G>PS. немного подумав. и все-таки, для некоторых вещей такие техники вполне имеют смысл, например для каких-то базовых сущностей системы. Например, ордер в торговой системе инварианты которого проверяются компилятором это скорее добро, чем зло, учитывая, что модифицируется он крайне редко и можно потратить силы на систему типов один раз.


У нас ордер проходит через машину состяний, достаточно сложную и разветвленную, сильно зависящую от конфигурация (по странам + по магазинам). Я сложно представляю, какой развесистый тип должен быть у заказа, чтобы «все было проверено»


dmitriid.comGitHubLinkedIn
Re[20]: Haskell нужен! (в Standard Chartered Bank)
От: genre Россия  
Дата: 04.02.15 11:05
Оценка:
Здравствуйте, Mamut, Вы писали:


M>У нас ордер проходит через машину состяний, достаточно сложную и разветвленную, сильно зависящую от конфигурация (по странам + по магазинам). Я сложно представляю, какой развесистый тип должен быть у заказа, чтобы «все было проверено»


Я тоже
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[14]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 04.02.15 12:03
Оценка:
Здравствуйте, Mamut, Вы писали:

K>>Ок, с конкретикой: нельзя будет сконструировать заказ с состоянием "Отправленный" и "Непроверенный как написано в 4-м пункте" одновременно, так что в случае забывания 4-го пункта будет ошибка компиляции. Ну, как нельзя забыть проверить значение типа Maybe Foo на пустоту и вызвать функцию bar заданную на Foo, потому что она на Maybe Foo не определена.


M>Легко предание, да не верится вообще нифига.


Во что не верится-то? В каком месте тут вера нужна?

M>Сколько условий «Непроверенный как написано в энном пункте» предлагаешь впихивать в тип?


Столько сколько нужно.

M>Каким образом это поможет мне не забыть вписать в тип ошибку «Непроверенный как написано в энном пункте»? <- вот это и есть логическая ошибка, от которой все сказки про типы не спасут


Во первых мы уже улучшили ситуацию переходом, от того как мне не забыть проверить что-то в 1024-х местах к тому, как мне не забыть включить что-то в тип (что то же самое, что не забыть включить в спецификацию, что вы естественно тоже можете забыть).
Во-вторых если у вас достаточно сложная спецификация в типе закодирована, то в том случае, если у вас какие-то проблемы с самой спецификацией на типах — скорее всего возникнут противоречия в спецификации, которые тайпчекер сможет обнаружить.

M>Каким образом это мне поможет на этапе компиляции, если вся информация о заказе идет в рантайме (включая такие прекрасные вещи, как конфигурации десятка параметров из базы данных)?


В чем вы тут проблему увидели?

M>Ты перенес все эти четыре десятка условий в типы, молодца. Как ты собираешься проверять, что ты эти условия описал в типах логически правильно?


См. выше.

M>Это я еще умолчал о разных веселых сайд-эффектах:

M>- отсылать e-mail'ы разных типов при разных действиях
M>- в зависимости от конфигураций и того, что выбрал пользователь, отсылать бумажные письма
M>- дергать payments/dunning/bookkeeping за разные части в разные моменты
M>- вызывать risk check и производить разные действия в зависимости от результата. Не на всех этапах, естественно
M>- обрабатывать случаи нестандартной интеграции (в основном, для очень больших магазинов)
M>и еще вагон и маленькая тележка

И? Тем больше пользы будет от стат. проверки типов.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[18]: Haskell нужен! (в Standard Chartered Bank)
От: AlexRK  
Дата: 04.02.15 12:03
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Спасибо. Это все равно возвращает к изначальным:

M>- кто и как будет проверять, правильно ли реализована логика в этих типах

По идее, проверять будет компилятор. Проверить можно только "где-то в середине" — там, где одна функция ожидает одно, а другая ей дает другое.

Возьмем это.

- Есть заказ.
- Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа
- Величина, на которую можно увеличить сумму заказа, зависит от:
  - Страны, в которой сделан заказ по конфигурируемому умолчанию
    - для Германии:
      - уменьшить можно на max(10% от оригинальной суммы заказа, 10 евро)
      - увеличить можно на max(10% от оригинальной суммы заказа, 10 евро)
  - Магазина, в котором сделан заказ
    - если конфигурации для магазина нет, берутся умолчания для страны магазина
  - если заказ помечен, как pre-paid, увеличивать сумму нельзя, уменьшать можно
    - уже есть тикет, который позволяет увеличивать сумму заказа для pre-paid заказов в зависимости от конфигурации магазина
M>


Рассматриваю для простоты только первые две строчки.

Псевдокод:

  type Order is
    ID: Integer;
    Sum: Money;
    Sent: Boolean;
  end;

  type SentOrder is Order where Sent = true;
  type UnsentOrder is Order where Sent = false;

  function SendOrder(order: UnsentOrder): SentOrder is
    ...
  end;

  function ChangeOrderSum(order: UnsentOrder, newSum: Money): UnsentOrder is    // эту функцию нельзя вызвать для заказа, у которого Sent равно true!
    ...
  end;

  function PrintOrderDetails(order: SentOrder) is
    ...
  end;

  var order := CreateOrder(1, 12000.00);
  order := ChangeOrderSum(order, 2800.23);
  order := SendOrder(order);
//  order := ChangeOrderSum(order, 5555.00);    // error
  PrintOrderDetails(order);    // OK


Таким образом, тут мы "закодировали в типах" требование "Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа". Компилятор запрещает нарушать его.

Могли ли мы ошибиться при реализации этого требования? Могли. Но все равно существует вероятность обнаружения ошибки компилятором, есть шанс, что где-то какие-то типы "не срастутся". В данном случае, чтобы компилятор ничего не заподозрил, нам пришлось бы ошибиться сразу в двух сигнатурах функций (в SendOrder+ChangeOrderSum, или в ChangeOrderSum+PrintOrderDetails). Но, конечно, какая-то "отладка типов" тоже нужна, да.
Re[16]: Haskell нужен! (в Standard Chartered Bank)
От: Klapaucius  
Дата: 04.02.15 12:35
Оценка:
Здравствуйте, Mamut, Вы писали:

M>>>Сколько условий «Непроверенный как написано в энном пункте» предлагаешь впихивать в тип?

K>>Для начала в конструктор значения этого типа.
K>>Проектируя тип "Заказ", Вы просто описываете вашу спецификацию как конструкторы. Если в спецификации противоречия, вы даже можете их на этом этапе обнаружить. А потом тайпчекер уже заботится о том, что вы все проверяете по спецификации.

M>Можно больше конкретики? Я согласен на примеры кода.


Вы же свой пример описали словами, а не в коде. Чем вас точно такой же ответ не устраивает? Я и сам согласен на пример кода.
Напишите нетипизированную программу, приведите тестовые данные, тогда можно будет написать типизированную версию в качестве ответа.

M>Это не ответ на мой вопрос


Т.е. ваш вопрос был о том, что будет если вы "забудете про 4-й пункт" на этапе спецификации?
Речь шла о том, чем лучше логика "закодированная в типах", чем не закодированная. Это показано. Теперь вдруг оказалось, вы спрашиваете, чем поможет система типов если вы что-то не "закодируете". Может и ни чем не помочь, но на практике помогает.
Представим, что ни программист особых усилий не прилагает чтоб что-то там кодировать, ни система типов особо не блещет возможностями.
Тем не менее, как подметил Пирс, даже если попытаться доказать что-то довольно простое в программе с ошибкой часто что-нибудь "не срастется", типы не совпадают. Это и называется "легковесной верификацией". Даже если тип совсем простая теорема, которая учитывает очень малую часть реальной спецификации терма, этот тип населяющего, попытавшись доказать теорему мы зачастую что-нибудь да найдем если код с ошибкой. Т.е. даже если программист ленится использовать типы — что-то тайпчек все равно отловит, хотя и меньше, чем если бы программист постарался переложить больше работы на тайпчек. Чтоб испортить этот бесплатный праздник нужно уже какие-то усилия по обходу/затиранию типов прилагать, строково-ориентированным программированием, всякими кастами, реинтерпретацией памяти, рефлексией и другими веселыми вещами. Т.е. программист уже должен быть не просто ленивым, а активно злонамеренным.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[7]: Haskell нужен! (в Standard Chartered Bank)
От: a_g_99 США http://www.hooli.xyz/
Дата: 04.02.15 13:04
Оценка: :)
Здравствуйте, jazzer, Вы писали:

J>Смотря для чего. Чтоб за один день въехать и накропать что-то как-то работающее — безусловно. Чтоб писать хороший код, надо становиться профессионалом, что гораздо дольше, и в этом смысле двухнедельный выигрыш при въезжании в язык с нуля роли не играет, имхо. Гораздо важнее изучить и прочувствовать идиомы, перестроить образ мыслей — это все занимает время (у некоторых бесконечное — они так и продолжают писать в высокоуровневых языках как на бейсике).

Что есть "хороший код" по вашему? И почему pyhton-исты производят говнокод а хаскеллисты хороший? Из ваших слов получается потому что хаскелл сложнее out-of-box, он имеет идиомы "которые надо прочуствовать". Т.е in fact ЯП задает тон разработки инженеру, а если инженер уклоняется от этого пути, начинается борьба с ЯП.
Я же уверен что все должно быть наоборот. Настоящий профессионал-инженер использует ЯП только как tools чтобы решить задачу. Сам формирует лучшие идиомы для решения, реализует нужные абстракции и тд. И принцип KISS в такой парадигме будет просто идеален. Поэтому такие простые на первый взгляд языки как javascript и python завоевывют мир, а хаскелл продолжает болтаться где-то в подбрюшье банков категории Б

J>Ну вот утверждается, что в ФП все это проще и в каком-то виде из коробки.

Это не соответствует реальности. Хаскеллу 25 лет, его популярность где-то ~ 0. Если бы это было так просто из коробки все бы пилили на хаскелле, а не на пайтоне или плюсах.

J>Вот утверждают, что все ровно наооброт. Что ФП-код гораздо более ясный и прозрачный и гораздо лучше работает в стиле "собрать из крипичиков, и чтоб не макароны получились".

Так не надо собирать из кирпичиков. В этом-то и главная беда хаскеллов. У него кирпичики имеют геометрическую форму амплитуэдра. И когда из этих кирпичиков надо построить что-то простое и обычное, получается полный трэш. Хороший инженер всегда должен использовать принцип play-doh вместо этого.

J>В смысле набора программеров? Ну да, хаскеллистов меньше, чем джавистов, тут спору нет.

В смысле, что для поддержки проекта или системы нужно в первую очередь хорошо представлять граф связей модулей в проекте. А так как в ФП и хаскеле он крайне не очевиден, то разрастающиеся системы становятся адом. Новичку сильно проще увеличить количество говнокода дописав что-то свое вместо использования уже написанного.
Re[15]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 13:08
Оценка:
M>>Легко предание, да не верится вообще нифига.
K>Во что не верится-то? В каком месте тут вера нужна?

Во все то, что ты тут так радостно описываешь. Заметь: ты ограничиваешь ся строго заявлениями уровня «все будет хорошо»

M>>Сколько условий «Непроверенный как написано в энном пункте» предлагаешь впихивать в тип?

K>Столько сколько нужно.

/o\

В итоге у тебя будет развесистый тип, включающий в себя стопятьсот условий. Прекрасно. Чем это лучше любого другого решения? Как ты будешь проверять, что эти стопятьсот условий у тебя реализованы правильно?

M>>Каким образом это поможет мне не забыть вписать в тип ошибку «Непроверенный как написано в энном пункте»? <- вот это и есть логическая ошибка, от которой все сказки про типы не спасут


K>Во первых мы уже улучшили ситуацию переходом, от того как мне не забыть проверить что-то в 1024-х местах


Откуда взялись 1024 мест, известно только тебе

K>к тому, как мне не забыть включить что-то в тип (что то же самое, что не забыть включить в спецификацию, что вы естественно тоже можете забыть).

K>Во-вторых если у вас достаточно сложная спецификация в типе закодирована, то в том случае, если у вас какие-то проблемы с самой спецификацией на типах — скорее всего возникнут противоречия в спецификации, которые тайпчекер сможет обнаружить.

Опять сказки про белого бычка.

M>>Ты перенес все эти четыре десятка условий в типы, молодца. Как ты собираешься проверять, что ты эти условия описал в типах логически правильно?

K>См. выше.

Выше ты не слова не сказал про то, как находятся логические ошибки. Ты сказал ровно две вещи:
— вместо 1024 мест будет одно
— тайпчекер выявит проблемы спецификации

1024 места ты придумал. Каким образом тайпчекер выявит проблемы спецификации — неизвестно. Я это, видимо, должен просто на веру принять. Видимо, те 40 условий, что ты предложил впихнуть в тип, моментально становятся правильными только из-за того, что ты описал в типе, ага


M>>Это я еще умолчал о разных веселых сайд-эффектах:

M>>- отсылать e-mail'ы разных типов при разных действиях
M>>- в зависимости от конфигураций и того, что выбрал пользователь, отсылать бумажные письма
M>>- дергать payments/dunning/bookkeeping за разные части в разные моменты
M>>- вызывать risk check и производить разные действия в зависимости от результата. Не на всех этапах, естественно
M>>- обрабатывать случаи нестандартной интеграции (в основном, для очень больших магазинов)
M>>и еще вагон и маленькая тележка

K>И? Тем больше пользы будет от стат. проверки типов.


Каким образом? Каким образом стат. проверка типов поможет отослать правильное письмо, сделать правильный risk check и т.п., да еще в нужные моменты времени?


dmitriid.comGitHubLinkedIn
Re[17]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 13:08
Оценка:
M>>Можно больше конкретики? Я согласен на примеры кода.
K>Вы же свой пример описали словами, а не в коде. Чем вас точно такой же ответ не устраивает? Я и сам согласен на пример кода.
K>Напишите нетипизированную программу, приведите тестовые данные, тогда можно будет написать типизированную версию в качестве ответа.

Я привел простейший пример тут: http://rsdn.ru/forum/philosophy/5943418
Автор: Mamut
Дата: 04.02.15


Тут не нужны ни нетипизированная программа, ни тестовые данные. Потому что она в лоб решается так, как там описано:

update_order(Order, Amount) ->
  Estore         = order_api:get_estore(Order),
  Country        = estore_api:get_country(Estore),
  OriginalAmount = order_api:get_original_amount(Order),
  AmountDiff     = OriginalAmount - Amount,

  case AmountDiff > 0 andalso order_api:is_prepaid(Order) of
    true -> {error, amount};
    false -> 
        %% config сам определяет, что брать — конфиг магазина или страны,
        %% если 
        MaxIncreasePct = config:get_max_config_increase_pct(Estore),
        MaxIncrease    = config:get_max_config_increase(Estore),
        MaxDecreasePct = config:get_max_config_decrease_pct(Estore),
        MaxDecrease    = config:get_max_config_decrease(Estore),

        case (AmountDiff < 0 andalso abs(AmountDiff) > max(....)).... of
           true -> {error, amount};
           false -> 
             UpdatedOrder = order_api:set_amount(Order, Amount),
             order_ops:write(UpdatedOrder)
        end
  end.


Я так предполагаю, ответом на это будет «а, ну тут просто, просто пиши инициализаторы, все будет зашибись, верь»

M>>Это не ответ на мой вопрос

K>Т.е. ваш вопрос был о том, что будет если вы "забудете про 4-й пункт" на этапе спецификации?

Вопрос был. Как ты не смог его понять — это выше моего понимания.

K>Речь шла о том, чем лучше логика "закодированная в типах", чем не закодированная. Это показано.


Да не показано нигде. Идут сплошные сказки и рассказы про то, как все будет зашибись, и я в это должен верить Как магическая система типов все сома отловит, как невозможно будет написать неправильный код и т.п.

Извини, не верю. Учитывая, что ты даже не смог ни разу ответить на простой вопрос «как это все будет проверяться и дебажиться».

K>Теперь вдруг оказалось, вы спрашиваете, чем поможет система типов если вы что-то не "закодируете". Может и ни чем не помочь, но на практике помогает.


Пока что вся «практика» упирается в рассказы и сказки о том, как все хорошо. Внятно на мои вопросы пока ответило ровно два человека — genre
Автор: genre
Дата: 04.02.15
и Evgeny.Panasyuk
Автор: Evgeny.Panasyuk
Дата: 03.02.15
. lazy-cjow-rhrrпопытался
Автор: lazy-cjow-rhrr
Дата: 03.02.15
, но его ответ даже близко не был связан с моими вопросами


[много текста про то, как магический тайпчек все отловит, невзирая на леность программиста, просто поскипано]


dmitriid.comGitHubLinkedIn
Re[19]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 13:14
Оценка:
ARK>Рассматриваю для простоты только первые две строчки.

Действительно. Дальше же работа с конфигурацией идет, там уже все не так весело


ARK>Псевдокод:


ARK>
ARK>  type SentOrder is Order where Sent = true;
ARK>  type UnsentOrder is Order where Sent = false;

ARK>  function ChangeOrderSum(order: UnsentOrder, newSum: Money): UnsentOrder is    // эту функцию нельзя вызвать для заказа, у которого Sent равно true!
ARK>    ...
ARK>  end;


Чем это принципиально отличается от API с такими же условиями?


ARK>  var order := CreateOrder(1, 12000.00);
ARK>  order := ChangeOrderSum(order, 2800.23);
ARK>  order := SendOrder(order);
ARK>//  order := ChangeOrderSum(order, 5555.00);    // error
ARK>  PrintOrderDetails(order);    // OK

ARK>


Да-да. Error. Потому что в реальности все так и происходит, ага-ага

В реальности происходит так:
Order = read_order_from_db(OrderId),
change_order_amount(Order, Amount).


Ой. Внезапно на этапе компиляции мы даже не знаем, будет заказ отправелнным или неотправленным. Какая печаль!


ARK>Таким образом, тут мы "закодировали в типах" требование "Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа". Компилятор запрещает нарушать его.


Вау. Ага. Так как мне поможет компилятор в тех двух строчках кода, что я привел?

ARK>Могли ли мы ошибиться при реализации этого требования? Могли.


Я об этом (среди прочего) и говорю уже пятнадцать сообщения подряд Нет, «магический тайпчекер все проверит»

ARK>Но все равно существует вероятность обнаружения ошибки компилятором, есть шанс, что где-то какие-то типы "не срастутся".


«Есть вероятность», «есть шанс»... Это не аргументы — это вера.

ARK>В данном случае, чтобы компилятор ничего не заподозрил, нам пришлось бы ошибиться сразу в двух сигнатурах функций (в SendOrder+ChangeOrderSum, или в ChangeOrderSum+PrintOrderDetails). Но, конечно, какая-то "отладка типов" тоже нужна, да.


Какая? Я уже пятнадцать раз спросил, как, реализовав логику на типах, люди собираются ее проверять?


dmitriid.comGitHubLinkedIn
Отредактировано 04.02.2015 13:40 Mamut [ищите в других сетях] . Предыдущая версия .
Re[20]: Haskell нужен! (в Standard Chartered Bank)
От: AlexRK  
Дата: 04.02.15 13:56
Оценка:
Здравствуйте, Mamut, Вы писали:

ARK>>Рассматриваю для простоты только первые две строчки.

M>Действительно. Дальше же работа с конфигурацией идет, там уже все не так весело

Я просто для иллюстрации. Понятно, что сложность/возможность задать проверки с помощью типов напрямую зависят от возможностей конкретного ЯП и геморройности предметной области.

M>Чем это принципиально отличается от API с такими же условиями?


Если в широком смысле — то ничем, дополнительные ограничения на типы это просто полезные возможности ЯП для создания более грамотного API.

Мой пример тривиален, но можно ведь придумать типы и поинтереснее, например "where Sent=true and (Sum>100 or Sum<200)".

Или вас интересует не принцип "выноса логики в типы", а конкретные возможности какого-то конкретного ЯП?

M>В реальности происходит так:

M>
M>Order = read_order_from_db(OrderId),
M>checnge_order_amount(Order, Amount).
M>


M>Ой. Внезапно на этапе компиляции мы даже не знаем, будет заказ отправелнным или неотправленным. Какая печаль!


Внезапно в этом месте будет ошибка компиляции — ибо checnge_order_amount хочет не тот тип, который выдает read_order_from_db. Какая печаль.
Вот вам компилятор и отловил баг.

ARK>>Таким образом, тут мы "закодировали в типах" требование "Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа". Компилятор запрещает нарушать его.

M>Вау. Ага. Так как мне поможет компилятор в тех двух строчках кода, что я привел?

Написал выше.

ARK>>Могли ли мы ошибиться при реализации этого требования? Могли.

M>Я об этом (среди прочего) и говорю уже пятнадцать сообщения подряд Нет, «магический тайпчекер все проверит»

Несоответствия обязательно проверит.

ARK>>Но все равно существует вероятность обнаружения ошибки компилятором, есть шанс, что где-то какие-то типы "не срастутся".

M>«Есть вероятность», «есть шанс»... Это не аргументы — это вера.

Вы же понимаете отличие статической типизации от динамической? Или там тоже вера?
Вот и здесь то же самое — что-то _дополнительно_ проверяется статически.

M>Какая? Я уже пятнадцать раз спросил, как, реализовав логику на типах, люди собираются ее проверять?


Если будут несоответствия в типах — вылетит ошибка компиляции. Но даже если все типы соответствуют друг другу, это не гарантирует корректность программы, надо тестировать, как обычно.
Но некоторая часть ошибок будет выловлена компилятором.
Re[21]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 14:12
Оценка:
M>>Чем это принципиально отличается от API с такими же условиями?

ARK>Если в широком смысле — то ничем, дополнительные ограничения на типы это просто полезные возможности ЯП для создания более грамотного API.

ARK>Мой пример тривиален, но можно ведь придумать типы и поинтереснее, например "where Sent=true and (Sum>100 or Sum<200)".

В языке с паттерн-матчингом это тривиально реализуется в API

ARK>Или вас интересует не принцип "выноса логики в типы", а конкретные возможности какого-то конкретного ЯП?


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

M>>В реальности происходит так:

M>>
M>>Order = read_order_from_db(OrderId),
M>>checnge_order_amount(Order, Amount).
M>>


M>>Ой. Внезапно на этапе компиляции мы даже не знаем, будет заказ отправелнным или неотправленным. Какая печаль!


ARK>Внезапно в этом месте будет ошибка компиляции — ибо checnge_order_amount хочет не тот тип, который выдает read_order_from_db. Какая печаль.

ARK>Вот вам компилятор и отловил баг.

Ээээ. С какого перепуга? Или у тебя заказы не в базе данных лежат?

M>>Вау. Ага. Так как мне поможет компилятор в тех двух строчках кода, что я привел?

ARK>Написал выше.

Ерунду написал

ARK>>>Могли ли мы ошибиться при реализации этого требования? Могли.

M>>Я об этом (среди прочего) и говорю уже пятнадцать сообщения подряд Нет, «магический тайпчекер все проверит»
ARK>Несоответствия обязательно проверит.

Несоответсвия чего чему?


M>>Какая? Я уже пятнадцать раз спросил, как, реализовав логику на типах, люди собираются ее проверять?

ARK>Если будут несоответствия в типах — вылетит ошибка компиляции. Но даже если все типы соответствуют друг другу, это не гарантирует корректность программы, надо тестировать, как обычно.

Именно

ARK>Но некоторая часть ошибок будет выловлена компилятором.


Могу только повторить: ошибки типизации — это очень маленькая часть от общего количества ошибок.


dmitriid.comGitHubLinkedIn
Re[22]: Haskell нужен! (в Standard Chartered Bank)
От: AlexRK  
Дата: 04.02.15 14:32
Оценка:
Здравствуйте, Mamut, Вы писали:

ARK>>Или вас интересует не принцип "выноса логики в типы", а конкретные возможности какого-то конкретного ЯП?

M>Меня интересует именно принцип. Тут мне рассказывают, насколько он мегакрут, а на практике никто не может даже внтяно объяснить, чем он так мегакрут.

Я как раз принцип и пытаюсь объяснить, но что-то пока безуспешно.

M>>>В реальности происходит так:

M>>>
M>>>Order = read_order_from_db(OrderId),
M>>>checnge_order_amount(Order, Amount).
M>>>


M>>>Ой. Внезапно на этапе компиляции мы даже не знаем, будет заказ отправелнным или неотправленным. Какая печаль!


ARK>>Внезапно в этом месте будет ошибка компиляции — ибо checnge_order_amount хочет не тот тип, который выдает read_order_from_db. Какая печаль.

ARK>>Вот вам компилятор и отловил баг.

M>Ээээ. С какого перепуга? Или у тебя заказы не в базе данных лежат?


А вот с такого. read_order_from_db возвращает заказ — Order. А какой он, отосланный или нет — мы при компиляции действительно не знаем. Значит, передавать этот Order без проверки в change_order_amount не имеем права — это и есть ошибка в логике.
Согласно спецификации, change_order_amount обязан оперировать не с любыми Order, а только с их подмножеством, у которых Sent=true. Мы записываем в сигнатуру change_order_amount тип "UnsentOrder" (вместо любого Order) — и получаем в каких-то местах ошибку компиляции (вот в этих двух строчках в частности).
И это правильно, потому что этот код некорректен. Чтобы он стал корректным, добавляем:
  Order = read_order_from_db(OrderId);
  if (Order.Sent = true)
    change_order_amount(Order, Amount);

и внезапно код теперь компилируется.

M>>>Вау. Ага. Так как мне поможет компилятор в тех двух строчках кода, что я привел?

ARK>>Написал выше.
M>Ерунду написал

Да нет, просто вы не понимаете, о чем речь (ну или спорите из принципа).

ARK>>>>Могли ли мы ошибиться при реализации этого требования? Могли.

M>>>Я об этом (среди прочего) и говорю уже пятнадцать сообщения подряд Нет, «магический тайпчекер все проверит»
ARK>>Несоответствия обязательно проверит.

M>Несоответсвия чего чему?


Одних типов другим типам (как в примере с заказами).

ARK>>Но некоторая часть ошибок будет выловлена компилятором.

M>Могу только повторить: ошибки типизации — это очень маленькая часть от общего количества ошибок.

У нас тут речь как раз о том, чтобы закладывать в программу больше семантики на уровне типов, тогда и дополнительных проверок будет больше.
Но сколько это "больше" в процентном отношении — зависит от кучи факторов. Может оказаться и вовсе невыгодно работать со сложным языком, хоть и позволяющим больше проверок.
Re[22]: Haskell нужен! (в Standard Chartered Bank)
От: genre Россия  
Дата: 04.02.15 14:36
Оценка:
Здравствуйте, Mamut, Вы писали:

M>>>В реальности происходит так:

M>>>
M>>>Order = read_order_from_db(OrderId),
M>>>checnge_order_amount(Order, Amount).
M>>>


M>Ээээ. С какого перепуга? Или у тебя заказы не в базе данных лежат?


Если псевдокодом, то предполагается как-то так:
Order[New] order = read_order_from_db(OrderId)
Order[Processed] processedOrder= order.processSomehow()

при этом имея метод: 
void checnge_order_amount(Order[Processed] order, Amount amount) 

ну и: 
checnge_order_amount(order, Amount) << ошибка
checnge_order_amount(processedOrder, Amount) << ок
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[23]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 14:57
Оценка:
M>>Ээээ. С какого перепуга? Или у тебя заказы не в базе данных лежат?

ARK>А вот с такого. read_order_from_db возвращает заказ — Order. А какой он, отосланный или нет — мы при компиляции действительно не знаем. Значит, передавать этот Order без проверки в change_order_amount не имеем права — это и есть ошибка в логике.


Это не ошибка в логике. Мы передаем черный ящик в API, который знает, как с этим ящиком работать. Где ошибка логики — неизвестно
Ошибка логики может быть дальше — где собственно реализуется изменение суммы заказа. Ну так она, как мы выяснили, может быть и в типе и в API


ARK>Согласно спецификации, change_order_amount обязан оперировать не с любыми Order, а только с их подмножеством, у которых Sent=true. Мы записываем в сигнатуру change_order_amount тип "UnsentOrder" (вместо любого Order) — и получаем в каких-то местах ошибку компиляции (вот в этих двух строчках в частности).

ARK>И это правильно, потому что этот код некорректен. Чтобы он стал корректным, добавляем:
ARK>
ARK>  Order = read_order_from_db(OrderId);
ARK>  if (Order.Sent = true)
ARK>    change_order_amount(Order, Amount);
ARK>

ARK>и внезапно код теперь компилируется.

Во-первых, стоп. Выше ничего не изменилось. Тип Order как был, так и остался Order. Или оборачивание его в if(Order.Sent = true) автоматом превратило его в SentOrder?

Во-вторых, ровно ноль разницы с API, которое имеет под капотом if Order.Sent/if Order.NotSent Более того, даже объемы тестов будут одинаковые. Причем при росте количества условий сам тип будет становиться мешаниной, а вызовы чего бы то ни было с этим типом будут ничем не отличаться от вызвовов без типов

ARK>Да нет, просто вы не понимаете, о чем речь (ну или спорите из принципа).


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

ARK>>>Но некоторая часть ошибок будет выловлена компилятором.

M>>Могу только повторить: ошибки типизации — это очень маленькая часть от общего количества ошибок.

ARK>У нас тут речь как раз о том, чтобы закладывать в программу больше семантики на уровне типов, тогда и дополнительных проверок будет больше.


Пока что я не убежден, от слова совсем. Разницы с API пока что ноль. Плюс проверки размазываются по всему коду: в одном месте что-то форсируется на уровне типов, в другом месте надо написать сто if'ов, чтобы впихнуть полученный объект в вызов.

ARK>Но сколько это "больше" в процентном отношении — зависит от кучи факторов. Может оказаться и вовсе невыгодно работать со сложным языком, хоть и позволяющим больше проверок.


Во-во


dmitriid.comGitHubLinkedIn
Re[23]: Haskell нужен! (в Standard Chartered Bank)
От: Mamut Швеция http://dmitriid.com
Дата: 04.02.15 15:00
Оценка:
M>>Ээээ. С какого перепуга? Или у тебя заказы не в базе данных лежат?

G>Если псевдокодом, то предполагается как-то так:

G>
G>Order[New] order = read_order_from_db(OrderId)
G>Order[Processed] processedOrder= order.processSomehow()

G>при этом имея метод: 
G>void checnge_order_amount(Order[Processed] order, Amount amount) 

G>ну и: 
G>checnge_order_amount(order, Amount) << ошибка
G>checnge_order_amount(processedOrder, Amount) << ок

G>


Вот откуда берется это детское восприятие, что все эти вызовы идут последовательно?

1 января. Создали заказ.
5 января. Отослали часть заказа или весь заказ.
13 января. Изменили заказ (добавили новые товары или скидку или оформили return) с изменением суммы заказа.

13 января заказ уже имеет статус «обработан и отослан». Нет никакого read -> process -> change_amount. Есть read -> change_amount.


dmitriid.comGitHubLinkedIn
Re[24]: Haskell нужен! (в Standard Chartered Bank)
От: genre Россия  
Дата: 04.02.15 15:16
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Вот откуда берется это детское восприятие, что все эти вызовы идут последовательно?


M>1 января. Создали заказ.

M>5 января. Отослали часть заказа или весь заказ.
M>13 января. Изменили заказ (добавили новые товары или скидку или оформили return) с изменением суммы заказа.

M>13 января заказ уже имеет статус «обработан и отослан». Нет никакого read -> process -> change_amount. Есть read -> change_amount.


Я тебе идею иллюстрирую, а ты к конкретной строчке докопался .
Ну пускай у тебя read_order_from_db(OrderId) возвращает Order
  • уже в правильном состоянии.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
  • Re[25]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 15:23
    Оценка:
    M>>13 января заказ уже имеет статус «обработан и отослан». Нет никакого read -> process -> change_amount. Есть read -> change_amount.

    G>Я тебе идею иллюстрирую, а ты к конкретной строчке докопался .


    Я понимаю, что идея. Только уже сколько раз эти идеи мало соотносятся с реальностью И твой пример, и первый пример AlexRK строго зависит от того, чтобы все изменения шли друг за другом, чтобы компилятор видел, что происходит в каждой точке с этим объектом

    G>Ну пускай у тебя read_order_from_db(OrderId) возвращает Order[*] уже в правильном состоянии.


    То есть ты предлагешь стандартное

    Order = read_order_from_db(OrderId),
    update_order_amount(Order, Amount)


    то есть на этапе компиляции уже никакой проверки не будет? Зачем тогда весь сыр-бор?


    dmitriid.comGitHubLinkedIn
    Re[26]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 04.02.15 15:29
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Я понимаю, что идея. Только уже сколько раз эти идеи мало соотносятся с реальностью И твой пример, и первый пример AlexRK строго зависит от того, чтобы все изменения шли друг за другом, чтобы компилятор видел, что происходит в каждой точке с этим объектом


    Нет, с чего ты взял? Тебе ничего не мешает инстанцировать сразу объект в нужном состоянии.

    M>То есть ты предлагешь стандартное


    M>
    M>Order = read_order_from_db(OrderId),
    M>update_order_amount(Order, Amount)
    M>


    M>то есть на этапе компиляции уже никакой проверки не будет? Зачем тогда весь сыр-бор?


    Нет.

    public Order[*] read_order_from_db(OrderId id); // читаем уже правильный ордер, либо Order[New] либо Order[Processed]
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[27]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 04.02.15 15:31
    Оценка:
    Здравствуйте, genre, Вы писали:

    G>
    G>public Order[*] read_order_from_db(OrderId id); // читаем уже правильный ордер, либо Order[New] либо Order[Processed]
    G>


    А, пардон, я неправильно понял, что ты имеешь ввиду. Да, в таком случае придется извернуться и после чтения из базы прогнать ордер по состояниям снова.

    Но все тоже возможно.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[27]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 15:33
    Оценка:
    M>>то есть на этапе компиляции уже никакой проверки не будет? Зачем тогда весь сыр-бор?

    G>Нет.


    G>
    G>public Order[*] read_order_from_db(OrderId id); // читаем уже правильный ордер, либо Order[New] либо Order[Processed]
    G>


    И? Дальше что?


    public Order[*] read_order_from_db(OrderId id);
    
    // каким образом тут компилятор проверит, что за Order сюда идет?
    // заказ же из базы читается
    change_order_amount(Order, Amount)


    dmitriid.comGitHubLinkedIn
    Re[22]: Haskell нужен! (в Standard Chartered Bank)
    От: D. Mon Великобритания http://thedeemon.livejournal.com
    Дата: 04.02.15 15:38
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ну вот вам простейший пример простейшей логики:


    M>
    M>- Есть заказ.
    M>- Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа
      ...
    M>  - если заказ помечен, как pre-paid, увеличивать сумму нельзя, уменьшать можно
    M>


    M>Просто же. Как можно больше логики можно на типах запрограммировать же.


    Да, просто, можно:
    data NewOrder -- основные качественные состояния заказа
    data PrepaidOrder 
    data SentOrder
    
    type Money = Int -- для простоты тут такие заглушки, реально Money описывает неотрицательные суммы в нужной валюте
    type OrderInfo = [String] 
    
    data Order state = Ordr Money OrderInfo -- тип заказа параметризован состоянием
    
    class CanChangeAmount a  -- в каких состояниях можно менять сумму
    instance CanChangeAmount NewOrder
    instance CanChangeAmount PrepaidOrder
    
    --уменьшить сумму. работает лишь для нужных состояний, сохраняет состояние
    decreaseAmount :: (CanChangeAmount state) => Order state -> Money -> Order state
    decreaseAmount (Ordr amt info) delta = Ordr (amt - delta) info
    
    --увеличить сумму. работает лишь для того состояния, где это разрешено
    increaseAmount :: Order NewOrder -> Money -> Order NewOrder
    increaseAmount (Ordr amt info) delta = Ordr (amt + delta) info


    В итоге компилятор хотя бы эту логику проверит статически и не даст менять сумму когда не положено. Остальные правила проще описать данными.
    Re[23]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 15:40
    Оценка:
    DM>В итоге компилятор хотя бы эту логику проверит статически

    Каким образом, если заказ читается из базы данных? Подробнее в этом обсуждении: http://rsdn.ru/forum/philosophy/5943812
    Автор: AlexRK
    Дата: 04.02.15


    DM>и не даст менять сумму когда не положено. Остальные правила проще описать данными.


    Что значит «проще описать данными»?


    dmitriid.comGitHubLinkedIn
    Re[28]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 15:40
    Оценка:
    G>>
    G>>public Order[*] read_order_from_db(OrderId id); // читаем уже правильный ордер, либо Order[New] либо Order[Processed]
    G>>


    G>А, пардон, я неправильно понял, что ты имеешь ввиду. Да, в таком случае придется извернуться и после чтения из базы прогнать ордер по состояниям снова.

    G>Но все тоже возможно.

    Зачем извращаться, и что это даст?


    dmitriid.comGitHubLinkedIn
    Re[28]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 04.02.15 15:43
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>И? Дальше что?



    M>
    M>public Order[*] read_order_from_db(OrderId id);
    
    M>// каким образом тут компилятор проверит, что за Order сюда идет?
    M>// заказ же из базы читается
    M>change_order_amount(Order, Amount)
    M>


    см. выше. придется догнать до нужного состояния снова. тут часть проверок действительно ляжет на рантайм.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[29]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 04.02.15 15:49
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Зачем извращаться, и что это даст?


    ну вот мы и вернулись к тому с чего начали это даст возможность покрыть часть ошибок в компайл-тайм. В случае с чтением из базы, часть рантайм проверок отработает и мы снова имеем правильный тип и снова полагаемся на компилятор.

    Какой процент ошибок так удастся поймать и стоит ли овчинка выделки видимо зависит от проекта.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[29]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 15:50
    Оценка:
    G>см. выше.

    Да, уже заметил

    G>придется догнать до нужного состояния снова. тут часть проверок действительно ляжет на рантайм.


    и чем больше у нас условий, тем больше проверок будет в рантайме с предсказуемым вопросом: а нафига козе баян?


    dmitriid.comGitHubLinkedIn
    Re[30]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 16:00
    Оценка:
    G>ну вот мы и вернулись к тому с чего начали

    :D

    G>это даст возможность покрыть часть ошибок в компайл-тайм. В случае с чтением из базы, часть рантайм проверок отработает и мы снова имеем правильный тип и снова полагаемся на компилятор.


    Но ведь фишка в том, что практически все — это чтение из какого-либо источника данных

    G>Какой процент ошибок так удастся поймать и стоит ли овчинка выделки видимо зависит от проекта.


    Как я уже говорил, есть далеко не одно исследование, которое говорит, что таких ошибок достаточно мало

    Сейчас, естетсвенно, лень эти исследования искать (а гугл вообще двинулся мозгами и сейчас в нем невозможно что-либо найти)


    dmitriid.comGitHubLinkedIn
    Re[31]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 04.02.15 16:07
    Оценка: 17 (1) +1
    Здравствуйте, Mamut, Вы писали:

    M>Как я уже говорил, есть далеко не одно исследование, которое говорит, что таких ошибок достаточно мало


    А я с этим и не спорил. Я тоже считаю, что количество пойманых таким образом ошибок компенсируется нечитабельностью кода.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[24]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 04.02.15 16:51
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Это не ошибка в логике. Мы передаем черный ящик в API, который знает, как с этим ящиком работать. Где ошибка логики — неизвестно


    Ошибка в логике заключается в том, что мы вызываем (пытаемся) функцию change_order_amount, передавая ей Order, у которого неизвестно состояние.
    Ошибка именно в нашем коде, потому что API явно декларирует требования к заказу.

    ARK>>Согласно спецификации, change_order_amount обязан оперировать не с любыми Order, а только с их подмножеством, у которых Sent=true. Мы записываем в сигнатуру change_order_amount тип "UnsentOrder" (вместо любого Order) — и получаем в каких-то местах ошибку компиляции (вот в этих двух строчках в частности).

    ARK>>И это правильно, потому что этот код некорректен. Чтобы он стал корректным, добавляем:
    ARK>>
    ARK>>  Order = read_order_from_db(OrderId);
    ARK>>  if (Order.Sent = true)
    ARK>>    change_order_amount(Order, Amount);
    ARK>>

    ARK>>и внезапно код теперь компилируется.

    M>Во-первых, стоп. Выше ничего не изменилось. Тип Order как был, так и остался Order. Или оборачивание его в if(Order.Sent = true) автоматом превратило его в SentOrder?


    Да, Order стал SentOrder после проверки. SentOrder — это такой "виртуальный" тип, который задается наложением ограничения на другой тип.
    Пример такого подхода можно увидеть здесь: http://ceylon-lang.org/documentation/1.0/tour/types/
    Проверка переменной в if или match "сужает" ее тип.

    M>Во-вторых, ровно ноль разницы с API, которое имеет под капотом if Order.Sent/if Order.NotSent Более того, даже объемы тестов будут одинаковые. Причем при росте количества условий сам тип будет становиться мешаниной, а вызовы чего бы то ни было с этим типом будут ничем не отличаться от вызвовов без типов


    Не-не, в API будет этот if в нескольких местах (а ведь он может быть и не таким простым). Мы можем заменить ифы просто нужным типом.
    Соответственно, мы один раз сделали все необходимые проверки, а дальше у нас просто переменная нужного типа путешествует по системе, а компилятор следит, чтобы мы ее не засунули туда, куда не нужно.
    Понятно, что в каких-то сценариях количество проверок будет одинаковое. А в каких-то одна проверка на входе и дальше 10 вызовов без проверок.

    Насчет мешанины в типе — да, наверно это может быть. ИМХО, это значит, что мы где-то что-то сделали не так (засунули в тип слишком много ответственностей).

    ARK>>У нас тут речь как раз о том, чтобы закладывать в программу больше семантики на уровне типов, тогда и дополнительных проверок будет больше.


    M>Пока что я не убежден, от слова совсем. Разницы с API пока что ноль. Плюс проверки размазываются по всему коду: в одном месте что-то форсируется на уровне типов, в другом месте надо написать сто if'ов, чтобы впихнуть полученный объект в вызов.


    Ну, тут плюс в том, что компилятор не даст сделать вызов, если нужных проверок не будет (т.е. ограничения на уровне типов влияют на обычный код) — это и есть та самая дополнительная корректность.
    Другой вопрос, что все на типах запрограммировать все равно не удастся (на современном уровне технологий), поэтому будут и обычные проверки в коде тоже.
    Re[25]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 17:16
    Оценка:
    ARK>Да, Order стал SentOrder после проверки. SentOrder — это такой "виртуальный" тип, который задается наложением ограничения на другой тип.
    ARK>Пример такого подхода можно увидеть здесь: http://ceylon-lang.org/documentation/1.0/tour/types/
    ARK>Проверка переменной в if или match "сужает" ее тип.

    По ссылке не вижу ничего подобного. Более того, я вижу там банальное if typeof(Object) == что-то там Только присыпанное синтаксическим сахаром

    M>>Во-вторых, ровно ноль разницы с API, которое имеет под капотом if Order.Sent/if Order.NotSent Более того, даже объемы тестов будут одинаковые. Причем при росте количества условий сам тип будет становиться мешаниной, а вызовы чего бы то ни было с этим типом будут ничем не отличаться от вызвовов без типов


    ARK>Не-не, в API будет этот if в нескольких местах (а ведь он может быть и не таким простым).


    Именно. if в нескольких местах, да еще не такой простой. Нафига козе баян?

    ARK>Мы можем заменить ифы просто нужным типом.


    Чтоа?

    ARK>Соответственно, мы один раз сделали все необходимые проверки, а дальше у нас просто переменная нужного типа путешествует по системе, а компилятор следит, чтобы мы ее не засунули туда, куда не нужно.


    Да-да. Следит, «нужного типа». Только вот незадача-то. Объект у нас одного типа — заказ.

    И дальше над ним может идти очень длинная последовательность действий. Где в одном действии ему надо быть уже отосланным, в другом — неотосланным, в пятом — отосланным, но неоплаченным, в десятом — просто не иметь статуса "fraud". Как предлагаешь поступать? Писать стопятьсот типов на каждый чих и комбинацию, а потом стопятьсот if'ов, инициализаторов и кастований из одного в другое?

    ARK>Понятно, что в каких-то сценариях количество проверок будет одинаковое. А в каких-то одна проверка на входе и дальше 10 вызовов без проверок.


    Это, вообще-то, КО программирования. Валидность объекта проверяет первая функция, а дальше ненужных проверок делать не нужно.

    ARK>Насчет мешанины в типе — да, наверно это может быть. ИМХО, это значит, что мы где-то что-то сделали не так (засунули в тип слишком много ответственностей).


    Да нет никаких много ответсвенностей Просто заказ. Только заказ — это простая сущность только в синтетических примерах. На практике — это достаточно сложная сущность, от которой разным компонентам системы нужно очень много разных вещей.


    ARK>>>У нас тут речь как раз о том, чтобы закладывать в программу больше семантики на уровне типов, тогда и дополнительных проверок будет больше.


    M>>Пока что я не убежден, от слова совсем. Разницы с API пока что ноль. Плюс проверки размазываются по всему коду: в одном месте что-то форсируется на уровне типов, в другом месте надо написать сто if'ов, чтобы впихнуть полученный объект в вызов.


    ARK>Ну, тут плюс в том, что компилятор не даст сделать вызов, если нужных проверок не будет (т.е. ограничения на уровне типов влияют на обычный код) — это и есть та самая дополнительная корректность.


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

    ARK>Другой вопрос, что все на типах запрограммировать все равно не удастся (на современном уровне технологий), поэтому будут и обычные проверки в коде тоже.


    Тогда нафига козе баян? Ну и как это? Меня тут активно пытались убедить, что все прекрасно, и чуть ли ен все можно в типы запихнуть


    dmitriid.comGitHubLinkedIn
    Re[26]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 04.02.15 17:56
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    ARK>>Да, Order стал SentOrder после проверки. SentOrder — это такой "виртуальный" тип, который задается наложением ограничения на другой тип.

    ARK>>Пример такого подхода можно увидеть здесь: http://ceylon-lang.org/documentation/1.0/tour/types/
    ARK>>Проверка переменной в if или match "сужает" ее тип.

    M>По ссылке не вижу ничего подобного. Более того, я вижу там банальное if typeof(Object) == что-то там Только присыпанное синтаксическим сахаром


    Ну вот первый пример оттуда:
    void printIfPrintable(Object obj) {
        if (is Printable obj) {
            obj.printObject();
        }
    }


    Тут "obj" внутри if стал уже другого типа (Printable, а извне if он просто Object) — причем без всяких кастов.

    ARK>>Мы можем заменить ифы просто нужным типом.

    M>Чтоа?

    Я имею в виду что-то типа:
    void Func1(MyObj obj)
    {
      if (obj.Prop == 3 && ....  // тут много проверок
        Use(obj);
    }
    
    void Func2(MyObj obj)
    {
      if (obj.Prop == 3 && obj.Prop2 == 4 && ....  // тут те же проверки, и еще пара других
        Use(obj);
    }
    
    MyObj obj = GetMyObj();
    Func1(obj);
    Func2(obj);
    
    
    // предлагаемый вариант (псевдокод)
    
    type MyCoolObj = MyObj where obj.Prop == 3 && ...   // тут все проверки
    
    void Func1(MyCoolObj obj)
    {
      Use(obj);  // проверок нет
    }
    
    void Func2(MyCoolObj obj)
    {
      if (obj.Prop2 == 4 && ....  // тут только пара "лишних" проверок
        Use(obj);
    }
    
    MyObj obj = GetMyObj();
    if (obj is MyCoolObj)    // все проверки в типе, тут ничего нет
    {
      Func1(obj);
      Func2(obj);
    }


    Отличие второго варианта (проверки в типе + условие "if (obj is MyCoolObj)") от банальной проверки всего, чего нужно, сразу после "MyObj obj = GetMyObj();" — в том, что мы кодируем проверки в типе и дальше можем сразу, подставляя MyCoolObj, гарантировать, что в этом месте все проверки уже сделаны (компилятор проследил). Если мы будем работать с просто MyObj, то контроля со стороны компилятора не будет (хотя работать все будет и так, просто тестировать придется и этот момент тоже).

    ARK>>Соответственно, мы один раз сделали все необходимые проверки, а дальше у нас просто переменная нужного типа путешествует по системе, а компилятор следит, чтобы мы ее не засунули туда, куда не нужно.

    M>Да-да. Следит, «нужного типа». Только вот незадача-то. Объект у нас одного типа — заказ.

    Не только, у нас есть просто заказ, есть отосланный заказ и неотосланный заказ. Это как предок и два потомка в ООП, только конверсия производится неявно — просто проверкой условий типа в if или match.

    M>И дальше над ним может идти очень длинная последовательность действий. Где в одном действии ему надо быть уже отосланным, в другом — неотосланным, в пятом — отосланным, но неоплаченным, в десятом — просто не иметь статуса "fraud". Как предлагаешь поступать? Писать стопятьсот типов на каждый чих и комбинацию, а потом стопятьсот if'ов, инициализаторов и кастований из одного в другое?


    Ну да, звучит, конечно, не очень приятно. В таких местах просто сложная логика и, конечно, сложность магически никуда не испаряется. Тут надо искать компромисс.

    ARK>>Понятно, что в каких-то сценариях количество проверок будет одинаковое. А в каких-то одна проверка на входе и дальше 10 вызовов без проверок.

    M>Это, вообще-то, КО программирования. Валидность объекта проверяет первая функция, а дальше ненужных проверок делать не нужно.

    КО, да не совсем. Конечно, ситуация известная, у того же Макконнелла хорошо описана. Но что забавно, у того же Макконнелла описана любопытнейшая ситуация:

    В этих обстоятельствах одна и та же ошибка может быть проверена и с помощью утверждения, и обработчиком ошибок. Так, в исходном коде Microsoft Word условия, которые должны быть истинными, сперва помещаются в утверждения, а затем и в коде обработки ошибок рассматривается ситуация, когда утверждение ложно. В столь сложных и долгоживущих приложениях, как Word, утверждения служат для выявления как можно большего числа ошибок периода разработки. Но поскольку приложение очень сложное (миллионы строк кода) и прошло через столько изменений, неразумно ожидать обнаружения и исправления всех мыслимых ошибок до начала поставки приложения пользователям. Поэтому ошибки должны обрабатываться и в промышленной версии системы.

    Это в точности та проблема, которую могут смягчить типы. Поскольку язык С++ не позволяет кодировать в типах дополнительную информацию, в больших программах ставят как можно больше проверок, из страха, что кто-то где-то уберет лишнюю проверку и все обрушится. Потому что компилятор бессилен — с его точки зрения все корректно. Если же ЯП позволяет расширить типы дополнительной информацией, то на помощь приходит компилятор.

    ARK>>Ну, тут плюс в том, что компилятор не даст сделать вызов, если нужных проверок не будет (т.е. ограничения на уровне типов влияют на обычный код) — это и есть та самая дополнительная корректность.

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

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

    ARK>>Другой вопрос, что все на типах запрограммировать все равно не удастся (на современном уровне технологий), поэтому будут и обычные проверки в коде тоже.

    M>Тогда нафига козе баян? Ну и как это? Меня тут активно пытались убедить, что все прекрасно, и чуть ли ен все можно в типы запихнуть

    Не, ну это явное преувеличение. Во всяком случае, я не знаю языков, которые позволяют _удобно_ записывать такие проверки.
    Re[27]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 21:19
    Оценка:
    ARK>Если мы будем работать с просто MyObj, то контроля со стороны компилятора не будет (хотя работать все будет и так, просто тестировать придется и этот момент тоже).

    Ну, тестирование все равно будет. Нам же надо будет проверить, что логика в этих типах закодирована правильно И что-то я сомневаюсь, что объем тестирования будет сильно отличаться

    ARK>Это в точности та проблема, которую могут смягчить типы. Поскольку язык С++ не позволяет кодировать в типах дополнительную информацию, в больших программах ставят как можно больше проверок, из страха, что кто-то где-то уберет лишнюю проверку и все обрушится. Потому что компилятор бессилен — с его точки зрения все корректно. Если же ЯП позволяет расширить типы дополнительной информацией, то на помощь приходит компилятор.


    Но, как мы только что выяснили, это справедливо только для простых объектов в простых сценариях использования


    dmitriid.comGitHubLinkedIn
    Re[28]: Haskell нужен! (в Standard Chartered Bank)
    От: artelk  
    Дата: 04.02.15 21:24
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>
    M>public Order[*] read_order_from_db(OrderId id);
    
    M>// каким образом тут компилятор проверит, что за Order сюда идет?
    M>// заказ же из базы читается
    M>change_order_amount(Order, Amount)
    M>


    read_order_from_db :: OrderId -> Either NewOrder ProcessedOrder

    И теперь для того, чтобы вызвать change_order_amount, требуется паттерн-матчинг для определения "подтипа".
    Re[29]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.02.15 21:44
    Оценка:
    A>
    A>read_order_from_db :: OrderId -> Either NewOrder ProcessedOrder
    A>

    A>И теперь для того, чтобы вызвать change_order_amount, требуется паттерн-матчинг для определения "подтипа".

    Ну то есть компилятор нам все равно нам особо-то не помогает. В общем, не нужно ©

    Потому что дальше все становится хуже, процитирую отсюда http://rsdn.ru/forum/philosophy/5944219
    Автор: Mamut
    Дата: 04.02.15

    Только вот незадача-то. Объект у нас одного типа — заказ.

    И дальше над ним может идти очень длинная последовательность действий. Где в одном действии ему надо быть уже отосланным, в другом — неотосланным, в пятом — отосланным, но неоплаченным, в десятом — просто не иметь статуса "fraud". Как предлагаешь поступать? Писать стопятьсот типов на каждый чих и комбинацию, а потом стопятьсот if'ов, инициализаторов и кастований из одного в другое?




    dmitriid.comGitHubLinkedIn
    Re[30]: Haskell нужен! (в Standard Chartered Bank)
    От: artelk  
    Дата: 04.02.15 22:54
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    A>>
    A>>read_order_from_db :: OrderId -> Either NewOrder ProcessedOrder
    A>>

    A>>И теперь для того, чтобы вызвать change_order_amount, требуется паттерн-матчинг для определения "подтипа".

    M>Ну то есть компилятор нам все равно нам особо-то не помогает. В общем, не нужно ©


    Почему не помогает? Он же не дает передать в change_order_amount неопределенный Order.

    M>Потому что дальше все становится хуже, процитирую отсюда http://rsdn.ru/forum/philosophy/5944219
    Автор: Mamut
    Дата: 04.02.15

    M>

    M>Только вот незадача-то. Объект у нас одного типа — заказ.

    M>И дальше над ним может идти очень длинная последовательность действий. Где в одном действии ему надо быть уже отосланным, в другом — неотосланным, в пятом — отосланным, но неоплаченным, в десятом — просто не иметь статуса "fraud". Как предлагаешь поступать? Писать стопятьсот типов на каждый чих и комбинацию, а потом стопятьсот if'ов, инициализаторов и кастований из одного в другое?


    M>)


    Думаю, что выражать через типы имеет смысл только достаточно стабильную часть логики, т.к. изменение типов может быть болезненной процедурой и затрагивать кучу мест в проекте.
    Ограничение "нельзя менять amount у processed order" выглядит стабильным.
    Если amount меняется только в одном месте, то, наверно, смысла выражать это правило через типы нет.
    Если таких мест 1024, то смысл появляется.

    += Еще один момент: некая функция принимает параметром Order, вызывает другую, та третью и далее по цепочке. Нам нужна гарантия, что эта некая функция не меняет amount, т.к. мы ее вызываем с processed order. Если тип параметра явно указать как ProcessedOrder, то такую гарантию нам даст компилятор, если нет — то остается только просматривать всю цепочку вызовов. Так что вышеуказанные "1024 мест" включают и такие случаи.
    Отредактировано 04.02.2015 23:13 artelk . Предыдущая версия .
    Re[30]: Haskell нужен! (в Standard Chartered Bank)
    От: Mumitroller Беларусь  
    Дата: 05.02.15 05:37
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>и чем больше у нас условий, тем больше проверок будет в рантайме с предсказуемым вопросом: а нафига козе баян?


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

    Mumitroller.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 56>>
    Re[24]: Haskell нужен! (в Standard Chartered Bank)
    От: D. Mon Великобритания http://thedeemon.livejournal.com
    Дата: 05.02.15 06:54
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    DM>>В итоге компилятор хотя бы эту логику проверит статически


    M>Каким образом, если заказ читается из базы данных? Подробнее в этом обсуждении: http://rsdn.ru/forum/philosophy/5943812
    Автор: AlexRK
    Дата: 04.02.15


    А какая разница, БД там, файл на магнитном барабане или сигнальные костры? Это лишь деталь реализации модуля хранения данных.
    Просто типы при записи в базу не должны теряться. Ты же не путаешь заказы с покупателями, хотя и те и другие хранятся в базе? Это разные типы. Вот и здесь тоже, заказы в разных состояниях будут разными типами. У них наверняка и набор полей может быть разный в зависимости от состояния. Скажем, дата отсылки имеет смысл для отосланного заказа, а способ оплаты — для оплаченного.

    DM>>и не даст менять сумму когда не положено. Остальные правила проще описать данными.


    M>Что значит «проще описать данными»?


    Табличка с правилами вычисления максимального изменения суммы в зависимости от страны, например.
    Re[31]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 08:42
    Оценка:
    A>Думаю, что выражать через типы имеет смысл только достаточно стабильную часть логики, т.к. изменение типов может быть болезненной процедурой и затрагивать кучу мест в проекте.

    Ой, как это? Мне тут рядом говорили, что придется менять не в 1024 местах, а только в одном месте

    A>Ограничение "нельзя менять amount у processed order" выглядит стабильным.


    Увы, нет Начиная с "все спецификации ad-hoc" из оригинального сообщения и до последнего тикета, который таки позволяет увеличивать сумму заказа для pre-paid закаов согласно конфигурации магазина. И это связано с дополнительной логикой — что, если

    A>+= Еще один момент: некая функция принимает параметром Order, вызывает другую, та третью и далее по цепочке. Нам нужна гарантия, что эта некая функция не меняет amount, т.к. мы ее вызываем с processed order. Если тип параметра явно указать как ProcessedOrder, то такую гарантию нам даст компилятор, если нет — то остается только просматривать всю цепочку вызовов. Так что вышеуказанные "1024 мест" включают и такие случаи.


    Во-первых, совсем не факт, что нам нужна эта гарантия. Во-вторых, если Order — это черный ящик, и смена суммы происходит через order:set_amount, то внезапно все проверки тоже оказываются в одном месте В-третьих, увеличение суммы может зависить не только от того, запроцессился заказ или нет.

    Лишь некоторые из условий:

    — заказ не обработан, заказ не pre-paid, сумма повышена, risk chek пройден: повысили
    — заказ не обработан, заказ не pre-paid, сумма повышена, risk chek не пройден: не повысили
    — заказ обработан, заказ не pre-paid, сумма повышена, risk chek пройден: повысили
    — заказ обработан, заказ не pre-paid, сумма повышена, risk chek не пройден: не повысили
    ...
    ...
    ...
    и ко всему этому еще надо добавить проверку «а если order expired?», «а надо ли делать re-auth в банке?», «а надо ли...» ну и т.п. :D


    dmitriid.comGitHubLinkedIn
    Re[25]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 08:59
    Оценка:
    DM>Вот и здесь тоже, заказы в разных состояниях будут разными типами. У них наверняка и набор полей может быть разный в зависимости от состояния. Скажем, дата отсылки имеет смысл для отосланного заказа, а способ оплаты — для оплаченного.

    /o\

    Действительно. Давай сделаем тип UnprocessedNonPrePaidRiskClearedOrder, ProcessedNonPrePaidRiskClearedOrder, UnprocessedPrePaidRiskClearedOrder, ProcessedPrePaidRiskClearedOrder и еще два десякта таких же. Это же так удобно!




    DM>>>и не даст менять сумму когда не положено. Остальные правила проще описать данными.


    M>>Что значит «проще описать данными»?

    DM>Табличка с правилами вычисления максимального изменения суммы в зависимости от страны, например.

    Она есть. В конфигурации. В базе данных. Зависит от от страны и магазина


    dmitriid.comGitHubLinkedIn
    Re: Haskell нужен! (в Standard Chartered Bank)
    От: zeeker  
    Дата: 05.02.15 11:50
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>К вопросу о том, что хаскель не нужен и это инструмент для гиков-энтузиастов и никто его в продакшене в здравом уме использовать не будет


    Тут давеча Майкрософт выложил свой Бонд (компетитор протобафа если кто не в курсе), так вот там кодогенерилка выполнена на хаскеле:
    https://github.com/Microsoft/bond/tree/master/compiler

    И, кстати да, она фактически занимается преобразованием DSL (IDL, .bond файлов) в C++ и C# code.
    Re[26]: Haskell нужен! (в Standard Chartered Bank)
    От: D. Mon Великобритания http://thedeemon.livejournal.com
    Дата: 05.02.15 12:24
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    DM>>Вот и здесь тоже, заказы в разных состояниях будут разными типами. У них наверняка и набор полей может быть разный в зависимости от состояния. Скажем, дата отсылки имеет смысл для отосланного заказа, а способ оплаты — для оплаченного.


    M>Действительно. Давай сделаем тип UnprocessedNonPrePaidRiskClearedOrder, ProcessedNonPrePaidRiskClearedOrder, UnprocessedPrePaidRiskClearedOrder, ProcessedPrePaidRiskClearedOrder и еще два десякта таких же. Это же так удобно!


    Ну, если ты пишешь на Си или Го, то такая беда, да. В нормальных же языках полиморфизм позволит общие вещи описать лишь однажды, а разницу вынести, так что ненужного повторения много не будет.
    Re[18]: Haskell нужен! (в Standard Chartered Bank)
    От: Klapaucius  
    Дата: 05.02.15 13:30
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Я привел простейший пример тут: http://rsdn.ru/forum/philosophy/5943418
    Автор: Mamut
    Дата: 04.02.15


    M>Тут не нужны ни нетипизированная программа, ни тестовые данные. Потому что она в лоб решается так, как там описано:


    Можно, например, определить функции проверки, обновлений, записывания не на одном и том же типе Order, а на разных типах различных стадий обработки Order.
    updateOrder :: Int -> Order -> Maybe Done
    updateOrder amount = check1 amount >=> check2 >=> update >=> writeOrder
    
    check1 :: Int -> Order -> Maybe Checked1
    check2 :: Checked1 -> Maybe Checked2
    update :: Checked2 -> Maybe Updated
    writeOrder :: Updated -> Maybe Done


    Тогда если пропустить проверку, перепутать местами этапы обработки, не обновить, не записать — будет ошибка компиляции.

    K>>Т.е. ваш вопрос был о том, что будет если вы "забудете про 4-й пункт" на этапе спецификации?

    M>Вопрос был. Как ты не смог его понять — это выше моего понимания.

    Это не ответ на мой вопрос.

    M>Да не показано нигде. Идут сплошные сказки и рассказы про то, как все будет зашибись, и я в это должен верить Как магическая система типов все сома отловит, как невозможно будет написать неправильный код и т.п.


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

    M>Извини, не верю. Учитывая, что ты даже не смог ни разу ответить на простой вопрос «как это все будет проверяться и дебажиться».


    Если вы игнорируете ответ, это еще не значит, что вам никто не ответил.

    M>[много текста про то, как магический тайпчек все отловит, невзирая на леность программиста, просто поскипано]


    Ничего магического в тайпчеке нет, не выдумывайте.
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[16]: Haskell нужен! (в Standard Chartered Bank)
    От: Klapaucius  
    Дата: 05.02.15 14:02
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    K>>Во что не верится-то? В каком месте тут вера нужна?

    M>Во все то, что ты тут так радостно описываешь.

    Это не ответ на мой вопрос.

    M>Заметь: ты ограничиваешь ся строго заявлениями уровня «все будет хорошо»


    Ну это точно неправда.
    Я написал следующее:

    нельзя будет сконструировать заказ с состоянием "Отправленный" и "Непроверенный как написано в 4-м пункте" одновременно, так что в случае забывания 4-го пункта будет ошибка компиляции. Ну, как нельзя забыть проверить значение типа Maybe Foo на пустоту и вызвать функцию bar заданную на Foo, потому что она на Maybe Foo не определена.

    Повторяю вопрос: что тут конкретно требует веры?

    M>В итоге у тебя будет развесистый тип, включающий в себя стопятьсот условий. Прекрасно. Чем это лучше любого другого решения? Как ты будешь проверять, что эти стопятьсот условий у тебя реализованы правильно?


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

    M>Откуда взялись 1024 мест, известно только тебе


    Оттуда же, откуда у вас "стопятьсот" условий взялось.

    K>>Во-вторых если у вас достаточно сложная спецификация в типе закодирована, то в том случае, если у вас какие-то проблемы с самой спецификацией на типах — скорее всего возникнут противоречия в спецификации, которые тайпчекер сможет обнаружить.


    M>Опять сказки про белого бычка.


    Интересно как вы сможете нагородить бессмыслицы таким образом, чтоб эта бессмыслица еще и типизировалась. Без серьезных трудозатрат по обходу системы типов разными способами тут не обойтись.

    M>Выше ты не слова не сказал про то, как находятся логические ошибки.


    Тайпчек — это процесс нахождения логических ошибок.

    M>Ты сказал ровно две вещи:

    M>- вместо 1024 мест будет одно
    M>- тайпчекер выявит проблемы спецификации
    M>1024 места ты придумал.

    Это, например, места вызова функций, определенных на обсуждаемом "развесистом типе". Навряд ли у вас тип "развесистым" получится и при том таких мест будет немного.

    M>Каким образом тайпчекер выявит проблемы спецификации — неизвестно.


    Это как раз известно. Почитайте какой-нибудь ликбез по тайпчекерам. Typing Haskell in Haskell, например, да что угодно.

    M>Я это, видимо, должен просто на веру принять.


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

    M>Видимо, те 40 условий, что ты предложил впихнуть в тип, моментально становятся правильными только из-за того, что ты описал в типе, ага


    M>Каким образом? Каким образом стат. проверка типов поможет отослать правильное письмо, сделать правильный risk check и т.п., да еще в нужные моменты времени?


    Поможет на ранних этапах выявить некоторые классы ошибок в коде, который "отсылает письмо", "делает правильный risk check" и т.п.
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[27]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 14:57
    Оценка:
    M>>Действительно. Давай сделаем тип UnprocessedNonPrePaidRiskClearedOrder, ProcessedNonPrePaidRiskClearedOrder, UnprocessedPrePaidRiskClearedOrder, ProcessedPrePaidRiskClearedOrder и еще два десякта таких же. Это же так удобно!

    DM>Ну, если ты пишешь на Си или Го, то такая беда, да. В нормальных же языках полиморфизм позволит общие вещи описать лишь однажды, а разницу вынести, так что ненужного повторения много не будет.



    «В нормальных языках», «полиморфизм». Ну можно на примере, а?


    dmitriid.comGitHubLinkedIn
    Re[19]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 15:07
    Оценка:
    M>>Тут не нужны ни нетипизированная программа, ни тестовые данные. Потому что она в лоб решается так, как там описано:

    K>Можно, например, определить функции проверки, обновлений, записывания не на одном и том же типе Order, а на разных типах различных стадий обработки Order.

    K>Тогда если пропустить проверку, перепутать местами этапы обработки, не обновить, не записать — будет ошибка компиляции.

    Если все эти проверки спрятаны в банальном API-вызове order:update_amount, то смысл? Вот у нас эта проверка существует уже лет шесть. Менялась один раз, весной. Второй раз будет меняться вот буквально через неделю.

    Главная проблема — не в мифических проблемах с типами, а в логике: на каком именно этапе сделать проверку, и какую именно проверку. Ну и написать тесты, проверяющие, что логика работает правильно

    M>>Да не показано нигде. Идут сплошные сказки и рассказы про то, как все будет зашибись, и я в это должен верить Как магическая система типов все сома отловит, как невозможно будет написать неправильный код и т.п.


    K>Вы что-то сильно разбушевались, как я посмотрю.


    Я не разбушевался. Я прошу простых внятных ответов на мои вопросы.

    K> сказки не рассказывал и не обещал, что "все будет зашибись".


    Да неужели? Процитирую тебя:

    Чтоб испортить этот бесплатный праздник [внезапно появившийся на пустом месте — М.] нужно уже какие-то усилия по обходу/затиранию типов прилагать, строково-ориентированным программированием, всякими кастами, реинтерпретацией памяти, рефлексией и другими веселыми вещами. Т.е. программист уже должен быть не просто ленивым, а активно злонамеренным.

    Для типов есть легковесная верификация

    Она не перестает быть логикой, она представляется в форме, которая хорошо подходит для автоматической проверки.


    И т.п.

    На практике, когда начинаешь говорить с людьми, которые дают внятные ответы с примерами того, что они имеют в виду, ВНЕЗАПНО оказывается, что нет: или типы становятся слишком сложными, или часть проверок все равно в рантайме и т.п.

    M>>Извини, не верю. Учитывая, что ты даже не смог ни разу ответить на простой вопрос «как это все будет проверяться и дебажиться».

    K>Если вы игнорируете ответ, это еще не значит, что вам никто не ответил.

    Если ответ состоит из расказов и сказок про то, как все будет великолепно, то да, я это проигнорирую.


    dmitriid.comGitHubLinkedIn
    Re[17]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 15:22
    Оценка:
    K>Ну это точно неправда.
    K>Я написал следующее:
    K>

    K>нельзя будет сконструировать заказ с состоянием "Отправленный" и "Непроверенный как написано в 4-м пункте" одновременно, так что в случае забывания 4-го пункта будет ошибка компиляции. Ну, как нельзя забыть проверить значение типа Maybe Foo на пустоту и вызвать функцию bar заданную на Foo, потому что она на Maybe Foo не определена.

    K>Повторяю вопрос: что тут конкретно требует веры?

    Опиши, как ты это себе представляешь, учитывая, что состяние «Отправленный и непроверенный как написано в 4-м пункте» — это только одно из условий, после чего этот заказ будет использоваться в следующей проверке, для которого нужен другой набор состояний.

    Ну тут есть
    Автор: Mamut
    Дата: 05.02.15
    в качестве примера. Это, кстати, еще не все условия.

    M>>В итоге у тебя будет развесистый тип, включающий в себя стопятьсот условий. Прекрасно. Чем это лучше любого другого решения? Как ты будешь проверять, что эти стопятьсот условий у тебя реализованы правильно?

    K>Т.е. вы ожидаете что в "развесистом типе" все "стопятьсот" условий будут "ортогональными" и в случае ошибки нигде не вступят в противоречие?

    То есть ты ожидаешь, что так не будет?


    M>>Откуда взялись 1024 мест, известно только тебе

    K>Оттуда же, откуда у вас "стопятьсот" условий взялось.

    Эти стопятосот условий описаны в одном API Вызывается оно из трех или четырех мест. Грубо говоря, order:set_amount(Order, Amount). Этот вызов возвращает или обновленный заказ или {error, Reason}.

    С какого перепугу что-то надо править в 1024 местах вместо одного, известно только тебе одному.

    K>Интересно как вы сможете нагородить бессмыслицы таким образом, чтоб эта бессмыслица еще и типизировалась. Без серьезных трудозатрат по обходу системы типов разными способами тут не обойтись.


    Ты пока не смог показать, как ты собираешься городить осмыслицу

    M>>Выше ты не слова не сказал про то, как находятся логические ошибки.

    K>Тайпчек — это процесс нахождения логических ошибок.

    С какого перепугу? Тайпчек — это проверка, что все типы сходятся. К логическим ошибкам он не имеет никакого отношения.

    K>Никто вас не заставляет ничего на веру принимать, не выдумывайте.


    Ну ты лично написал с полдесятка сообщений, рассказывая, как все прекрасно

    M>>Каким образом? Каким образом стат. проверка типов поможет отослать правильное письмо, сделать правильный risk check и т.п., да еще в нужные моменты времени?

    K>Поможет на ранних этапах выявить некоторые классы ошибок в коде, который "отсылает письмо", "делает правильный risk check" и т.п.

    Ой. Уже внезапно не «проверка логики» и не «условия не будут противоречить», а «некоторый класс ошибок». Внезапно, да.


    dmitriid.comGitHubLinkedIn
    Re[32]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.02.15 15:58
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    A>>Ограничение "нельзя менять amount у processed order" выглядит стабильным.


    M>Увы, нет Начиная с "все спецификации ad-hoc" из оригинального сообщения и до последнего тикета, который таки позволяет увеличивать сумму заказа для pre-paid закаов согласно конфигурации магазина. И это связано с дополнительной логикой — что, если


    Вот тут как раз и поможет компилятор — как раз с ad-hoc изменениями требований. Если раньше с processed order можно было делать все, что угодно, а потом вдруг "концепция поменялась" и amount у него больше менять нельзя — достаточно отразить это в определении типа, а дальше компилятор сам ткнет во все места, где код не соответствует новому определению, и попросит дописать соответствующие ифы вроде if (!processed) change_amount(), чтоб гарантировать, что у processed оредров никто amount менять не будет.
    Без типов — придется просматривать руками все вызовы change_amount по всему проекту и пытаться понять, где у нас processed, где не processed, а где рыбу заворачивали.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[32]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.02.15 16:01
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    A>>Думаю, что выражать через типы имеет смысл только достаточно стабильную часть логики, т.к. изменение типов может быть болезненной процедурой и затрагивать кучу мест в проекте.


    M>Ой, как это? Мне тут рядом говорили, что придется менять не в 1024 местах, а только в одном месте


    менять тип — да, в одном месте. Но код, не соответствующий изменившейся системе типов, возможно, придется менять в 1024 местах.
    Фишка в том, что компилятор не даст схалтурить и пропустить какие-то места.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[33]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 16:03
    Оценка:
    J>Без типов — придется просматривать руками все вызовы change_amount по всему проекту и пытаться понять, где у нас processed, где не processed, а где рыбу заворачивали.

    Что мешает вставить ровно одну проверку на is_processed собственно в change_amount? Тем более, что везде, где «заворачивали рыбу» известно, что смена суммы может и не пройти.


    dmitriid.comGitHubLinkedIn
    Re[18]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.02.15 16:13
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>С какого перепугу? Тайпчек — это проверка, что все типы сходятся. К логическим ошибкам он не имеет никакого отношения.


    Нет, вот здесь у тебя ошибка в рассуждениях.
    Тайпчек — это не проверка, что все типы сходятся (что бы это словосочетание ни означало).
    Это проверка, что код соответствует типам.
    Т.е. когда тайпчек заворачивает код sin("asd") — это не потому что типы не сходятся (теоретическая тарабарщина), а потому, что нельзя брать синус от строки (требование предметной области).

    Брать синус от строки — это именно логическая ошибка (а вот какой-нть JS наверняка такой код пропустит и не поперхнется даже в рантайме, если вдруг нам повезло и строка у нас содержит символ нуля).

    ЗЫ А теперь поставь вместо синуса и строки свои операции и ордера в разных состояниях.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[34]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.02.15 16:18
    Оценка:
    Здравствуйте, Mamut, Вы писали:


    J>>Без типов — придется просматривать руками все вызовы change_amount по всему проекту и пытаться понять, где у нас processed, где не processed, а где рыбу заворачивали.


    M>Что мешает вставить ровно одну проверку на is_processed собственно в change_amount?

    Зависит от того, что тебе нужно. Можно, конечно, все требования исключениями гарантировать. Нехай юзер пишет письма в суппорт с стек-дампами — типа "я тут кнопочку нажал, а оно мне вот, на три экрана" Тоже вариант.

    M>Тем более, что везде, где «заворачивали рыбу» известно, что смена суммы может и не пройти.

    Я не сомневаюсь в твоей способности загрузить меня деталями твоей программы.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[19]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 16:21
    Оценка:
    J>Тайпчек — это не проверка, что все типы сходятся (что бы это словосочетание ни означало).
    J>Это проверка, что код соответствует типам.

    ну это я имел в виду

    J>Т.е. когда тайпчек заворачивает код sin("asd") — это не потому что типы не сходятся (теоретическая тарабарщина), а потому, что нельзя брать синус от строки (требование предметной области).


    J>Брать синус от строки — это именно логическая ошибка (а вот какой-нть JS наверняка такой код пропустит и не поперхнется даже в рантайме, если вдруг нам повезло и строка у нас содержит символ нуля).


    Охо-хо. Логическая ошибка — это когда ты считаешь пеню в размере 50% от стоимости товара, а не 0.5%. Логическая ошибка — это когда позволяешь поднимать сумму в заказе выше определенной суммы, забыв проверить одно из условий.

    А не передача строки в вызов, который требует число.

    J>ЗЫ А теперь поставь вместо синуса и строки свои операции и ордера в разных состояниях.


    /o\

    Да-да. Замени синус на товар


    dmitriid.comGitHubLinkedIn
    Re[35]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 16:24
    Оценка:
    M>>Что мешает вставить ровно одну проверку на is_processed собственно в change_amount?
    J>Зависит от того, что тебе нужно. Можно, конечно, все требования исключениями гарантировать. Нехай юзер пишет письма в суппорт с стек-дампами — типа "я тут кнопочку нажал, а оно мне вот, на три экрана" Тоже вариант.

    О да. Ведь всатвить проверку в одно место — а именно собственно в реализацию API-вызова — это именно генерировать все исключениями и возвращать пользователю именно стек-дампы

    Вот с какого-то перепугу у нас пользователю ни одного стек-дампа не возвращается, все проверки происходят внутри одного API-вызова, но при этоя язык динамический. Невозможная магия, видать

    M>>Тем более, что везде, где «заворачивали рыбу» известно, что смена суммы может и не пройти.

    J>Я не сомневаюсь в твоей способности загрузить меня деталями твоей программы.

    Я не гружу тебя деталями своей программы. Это ты выставляешь какие-то идиотские требования к коду, типа «не, ну проверять is_processed надо же везде, где вызывается change_amount»



    Вот тут простейшие «детали моей программы»: http://rsdn.ru/forum/philosophy/5945374.flat
    Автор: Mamut
    Дата: 05.02.15


    dmitriid.comGitHubLinkedIn
    Re[33]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 05.02.15 16:35
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J> Если раньше с processed order можно было делать все, что угодно, а потом вдруг "концепция поменялась" и amount у него больше менять нельзя — достаточно отразить это в определении типа,


    Вот это все настолько красиво звучит, что было бы здорово увидеть пример, как запросто отразить это в определении типа. А то пока что в моем понимании это будет "переколбасить всю систему типов и огрести по полной".
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[34]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.02.15 16:40
    Оценка:
    Здравствуйте, genre, Вы писали:

    G>Здравствуйте, jazzer, Вы писали:


    J>> Если раньше с processed order можно было делать все, что угодно, а потом вдруг "концепция поменялась" и amount у него больше менять нельзя — достаточно отразить это в определении типа,


    G>Вот это все настолько красиво звучит, что было бы здорово увидеть пример, как запросто отразить это в определении типа. А то пока что в моем понимании это будет "переколбасить всю систему типов и огрести по полной".


    Ну да, огрести по полной, именно так, от компилятора, ты все правильно понял.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[36]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.02.15 16:53
    Оценка: +2
    Здравствуйте, Mamut, Вы писали:

    M>>>Что мешает вставить ровно одну проверку на is_processed собственно в change_amount?

    J>>Зависит от того, что тебе нужно. Можно, конечно, все требования исключениями гарантировать. Нехай юзер пишет письма в суппорт с стек-дампами — типа "я тут кнопочку нажал, а оно мне вот, на три экрана" Тоже вариант.

    M>О да. Ведь всатвить проверку в одно место — а именно собственно в реализацию API-вызова — это именно генерировать все исключениями и возвращать пользователю именно стек-дампы


    Так ведь дело-то в том, что проверку-то ты вставишь, а дальше-то что делать будешь с результатом этой проверки?
    т.е. вот у тебя было
    Order::change_amount(new_value) {
      value = new_value;
    }

    и теперь ты "вставляешь ровно одну проверку":
    Order::change_amount(new_value) {
      check(is_processed); //????
      value = new_value;
    }

    что в check должно происходить? исключение? ведь надо же как-то наверх сообщить, что облом?
    Или ты вставляешь ее так:
    Order::change_amount(new_value) {
      if (is_processed)
        value = new_value;
      else //????
    }

    что у нас в else? Ничего? Или возврат кода ошибки, типа удалось или нет изменить?
    bool Order::change_amount(new_value) {
      if (!is_processed) return false;
      value = new_value;
      return true;
    }

    Ну так это те же исключения, вид сбоку.

    Плюс на is_processed еще много чего может быть завязано. Например, в каком виде показывать ордер — задизейбленной формой, в которой уже ничего нельзя менять, или нормальной, где менять все можно. Или дизейблить надо не всю форму, а только поле amount и кнопку, которая зовет change_amount — чтоб нельзя было ее позвать дял такого ордера.
    Т.е. в идеале хотелось бы иметь код, в котором для processed ордеров просто-напросто нет вызовов change_amount — потому что они бессмысленны для таких ордеров (ну примерно как синус для строки).
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[34]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 05.02.15 17:43
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>Без типов — придется просматривать руками все вызовы change_amount по всему проекту и пытаться понять, где у нас processed, где не processed, а где рыбу заворачивали.

    M>Что мешает вставить ровно одну проверку на is_processed собственно в change_amount? Тем более, что везде, где «заворачивали рыбу» известно, что смена суммы может и не пройти.

    Так ты определись какие preconditions у change_amount.
    Если необходимость is_processed == true входит в предусловия, то любое его нарушение это баг в программе. Если такой баг обнаружен runtime check'ом, то нужно клеить ласты ASAP.
    Отражение состояния processed в типе, позволит гарантировать отсутствие такого бага в работающей программе. В то время как если проверка происходит в runtime, то даже 100% покрытие строк кода unit-тестами не даст такую гарантию (в более менее сложной программе).
    Если же такого предусловия нет, и есть постусловие вида "может изменить, а может и нет" — то непонятно зачем сюда пытаться впихнуть статические проверки.
    Отредактировано 05.02.2015 17:44 Evgeny.Panasyuk . Предыдущая версия .
    Re[28]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 05.02.15 17:59
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>>>Действительно. Давай сделаем тип UnprocessedNonPrePaidRiskClearedOrder, ProcessedNonPrePaidRiskClearedOrder, UnprocessedPrePaidRiskClearedOrder, ProcessedPrePaidRiskClearedOrder и еще два десякта таких же. Это же так удобно!

    DM>>Ну, если ты пишешь на Си или Го, то такая беда, да. В нормальных же языках полиморфизм позволит общие вещи описать лишь однажды, а разницу вынести, так что ненужного повторения много не будет.
    M>«В нормальных языках», «полиморфизм». Ну можно на примере, а?

    Не нужно вручную создавать тип с каждой комбинацией состояний, достаточно чего-то типа:
    template<bool processed, Payment payment>
    struct order {};
    
    using processed_and_prepaid = order<true, Payment::prepaid>;
    using unprocessed_and_paid = order<false, Payment::paid>;
    // ...
    order<true, Payment::prepaid> и order<false, Payment::paid> это разные типы, хотя шаблон типа описывается один раз.
    Re[37]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 19:37
    Оценка:
    J>Так ведь дело-то в том, что проверку-то ты вставишь, а дальше-то что делать будешь с результатом этой проверки?
    J>т.е. вот у тебя было
    J>
    J>Order::change_amount(new_value) {
    J>  value = new_value;
    J>}
    J>

    J>и теперь ты "вставляешь ровно одну проверку":
    J>
    J>Order::change_amount(new_value) {
    J>  check(is_processed); //????
    J>  value = new_value;
    J>}
    J>

    J>что в check должно происходить? исключение? ведь надо же как-то наверх сообщить, что облом?

    О ужас. Это же такая нерешенная никем задача!

    J>Ну так это те же исключения, вид сбоку.


    J>Т.е. в идеале хотелось бы иметь код, в котором для processed ордеров просто-напросто нет вызовов change_amount — потому что они бессмысленны для таких ордеров (ну примерно как синус для строки).


    Действительно. Который, наверное, просто тихо фейлится, не сообщая никому о том, что amount не изменился по какой-то никому не известной причине


    dmitriid.comGitHubLinkedIn
    Re[35]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 19:40
    Оценка:
    J>>>Без типов — придется просматривать руками все вызовы change_amount по всему проекту и пытаться понять, где у нас processed, где не processed, а где рыбу заворачивали.
    M>>Что мешает вставить ровно одну проверку на is_processed собственно в change_amount? Тем более, что везде, где «заворачивали рыбу» известно, что смена суммы может и не пройти.

    EP>Так ты определись какие preconditions у change_amount.


    ЧТо значит pre_conditions? У нас есть условия, при которых мы можем изменить сумму заказа.

    EP>Отражение состояния processed в типе, позволит гарантировать отсутствие такого бага в работающей программе. В то время как если проверка происходит в runtime, то даже 100% покрытие строк кода unit-тестами не даст такую гарантию (в более менее сложной программе).

    EP>Если же такого предусловия нет, и есть постусловие вида "может изменить, а может и нет" — то непонятно зачем сюда пытаться впихнуть статические проверки.

    Я не знаю, что такое предусловия, постусловия и прочая. У нас есть условия, при которых мы можем изменить сумму заказа. Мне тут рассказывают, как все прекрасно можно решить типами. Показывают, как «можно решить», только все эти примеры валятся, как карточные домики, при простейшем рассмотрении


    dmitriid.comGitHubLinkedIn
    Re[29]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 19:41
    Оценка:
    EP>Не нужно вручную создавать тип с каждой комбинацией состояний, достаточно чего-то типа:
    EP>
    EP>template<bool processed, Payment payment>
    EP>struct order {};
    
    EP>using processed_and_prepaid = order<true, Payment::prepaid>;
    EP>using unprocessed_and_paid = order<false, Payment::paid>;
    EP>// ...
    EP>
    order<true, Payment::prepaid> и order<false, Payment::paid> это разные типы, хотя шаблон типа описывается один раз.


    И как это дальше использовать. Ну, в реальной жизни, где идет несколько проверок подряд.


    dmitriid.comGitHubLinkedIn
    Re[30]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 05.02.15 20:24
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    EP>>Не нужно вручную создавать тип с каждой комбинацией состояний, достаточно чего-то типа:

    EP>>
    EP>>template<bool processed, Payment payment>
    EP>>struct order {};
    
    EP>>using processed_and_prepaid = order<true, Payment::prepaid>;
    EP>>using unprocessed_and_paid = order<false, Payment::paid>;
    EP>>// ...
    EP>>
    order<true, Payment::prepaid> и order<false, Payment::paid> это разные типы, хотя шаблон типа описывается один раз.

    M>И как это дальше использовать. Ну, в реальной жизни, где идет несколько проверок подряд.

    Каких проверок? На processed и на payment? Например показать что функция работает только с processed и prepaid:
    void foo(order<true, Payment::prepaid> x)
    {
        // use x
    }

    Если нужно обработать другие варианты — добавляются соответствующие перегрузки.
    Re[36]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 05.02.15 20:32
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>>>Без типов — придется просматривать руками все вызовы change_amount по всему проекту и пытаться понять, где у нас processed, где не processed, а где рыбу заворачивали.

    M>>>Что мешает вставить ровно одну проверку на is_processed собственно в change_amount? Тем более, что везде, где «заворачивали рыбу» известно, что смена суммы может и не пройти.
    EP>>Так ты определись какие preconditions у change_amount.

    M>ЧТо значит pre_conditions?


    Это те условия, которые должны быть выполнены перед запуском change_amount. Если эти условия не выполнены, то она имеет полное право делать что угодно. Это может быть попытка обнаружить нарушение предусловия, а-ля defensive programming, а может быть и фейерверк.

    M>Я не знаю, что такое предусловия, постусловия и прочая. У нас есть условия, при которых мы можем изменить сумму заказа. Мне тут рассказывают, как все прекрасно можно решить типами. Показывают, как «можно решить», только все эти примеры валятся, как карточные домики, при простейшем рассмотрении


    Например были показаны примеры как ограничить применение change_amount только отправленными заказами. В чём конкретно они валятся?
    Re[37]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.02.15 21:03
    Оценка:
    EP>Например были показаны примеры как ограничить применение change_amount только отправленными заказами. В чём конкретно они валятся?

    Потому что как только оказывается, что есть не только отправленные заказы, как оказывается, что надо или тип превращать в непонятную мешанину или «ой, да, надо таки проверки в рантайме делать».

    В общем, тут: http://rsdn.ru/forum/philosophy/5945374
    Автор: Mamut
    Дата: 05.02.15


    dmitriid.comGitHubLinkedIn
    Re[38]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 05.02.15 22:39
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    EP>>Например были показаны примеры как ограничить применение change_amount только отправленными заказами. В чём конкретно они валятся?

    M>Потому что как только оказывается, что есть не только отправленные заказы, как оказывается, что надо или тип превращать в непонятную мешанину или «ой, да, надо таки проверки в рантайме делать».

    А какие ещё? Отправленные, предоплаченные, рискованные? Я же уже показал подобное
    Автор: Evgeny.Panasyuk
    Дата: 05.02.15
    .
    Или ты про "Если изменение не попадает в эти рамки, то увеличить/уменьшить нельзя"? — такое да, в типах дорого кодировать. Но вывод-то какой?
    Re[39]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 06.02.15 07:14
    Оценка:
    EP>Или ты про "Если изменение не попадает в эти рамки, то увеличить/уменьшить нельзя"? — такое да, в типах дорого кодировать. Но вывод-то какой?

    Ну вывод такой, что сказки про то, как типы позволяют все и еще больше — это всего лишь сказки


    dmitriid.comGitHubLinkedIn
    Re[35]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 06.02.15 09:20
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    G>>Вот это все настолько красиво звучит, что было бы здорово увидеть пример, как запросто отразить это в определении типа. А то пока что в моем понимании это будет "переколбасить всю систему типов и огрести по полной".


    J>Ну да, огрести по полной, именно так, от компилятора, ты все правильно понял.


    Нет, есть ощущение, что при малейшем изменении в требованиях придется переписывать чуть ли не всю систему типов. Там где при рантайм проверках добавится пара ифов в случае с типами придется пройтись и подправить по огромное количество мест . Разве нет?
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[36]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 06.02.15 14:44
    Оценка: +3
    Здравствуйте, genre, Вы писали:

    G>Здравствуйте, jazzer, Вы писали:


    G>>>Вот это все настолько красиво звучит, что было бы здорово увидеть пример, как запросто отразить это в определении типа. А то пока что в моем понимании это будет "переколбасить всю систему типов и огрести по полной".


    J>>Ну да, огрести по полной, именно так, от компилятора, ты все правильно понял.


    G>Нет, есть ощущение, что при малейшем изменении в требованиях придется переписывать чуть ли не всю систему типов. Там где при рантайм проверках добавится пара ифов в случае с типами придется пройтись и подправить по огромное количество мест . Разве нет?


    Да. А как иначе? Вот в обычной программе у тебя можно было с processed-ордером делать все, что угодно, а потом стало нельзя — тебе _в любой программе_ надо будет пройтись по всем 1024 местам использования ордера и посмотреть, что конкретно ты с ним делаешь и можно ли с ним это делать. Согласен? И от этого никуда не уйти в любом случае.
    А разница проявляется в том, что, посещая эти 1024 места, ты легко можно 24 из них тупо пропустить, а еще в 128 — накосячить с изменениями. А если ты новое требование закодируешь в типе, то за тем, что ты посетил все 1024 места, проследит компилятор, и он просто не скомпилирует твою программу, пока ты не разберешься со всеми 1024 местами, причем пока не разберешься так, что компилятор будет удовлетворен.
    Собственно, в этом весь смысл.
    Типы не делают программирование легче и короче, они делают его надежнее и безопаснее.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[37]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 06.02.15 15:05
    Оценка: +1
    Здравствуйте, jazzer, Вы писали:

    J>А разница проявляется в том, что, посещая эти 1024 места, ты легко можно 24 из них тупо пропустить, а еще в 128 — накосячить с изменениями. А если ты новое требование закодируешь в типе, то за тем, что ты посетил все 1024 места, проследит компилятор, и он просто не скомпилирует твою программу, пока ты не разберешься со всеми 1024 местами, причем пока не разберешься так, что компилятор будет удовлетворен.

    J>Собственно, в этом весь смысл.

    Это с одной стороны правда, но ты как-то пропустил в моем вопросе слово "переписать систему типов". Есть подозрение, что в одном варианте придется пройтись по 1024 местам и подкрутить какую-то часть из них, а во второй пройтись вообще по всем местам использования ордера (система типов же поменялась) и подкрутить уже не 1024, а сильно больше.

    Вот я и попросил пример опровергующий это ощущение.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[38]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 06.02.15 15:13
    Оценка:
    J>>А разница проявляется в том, что, посещая эти 1024 места, ты легко можно 24 из них тупо пропустить, а еще в 128 — накосячить с изменениями. А если ты новое требование закодируешь в типе, то за тем, что ты посетил все 1024 места, проследит компилятор, и он просто не скомпилирует твою программу, пока ты не разберешься со всеми 1024 местами, причем пока не разберешься так, что компилятор будет удовлетворен.
    J>>Собственно, в этом весь смысл.

    G>Это с одной стороны правда, но ты как-то пропустил в моем вопросе слово "переписать систему типов". Есть подозрение, что в одном варианте придется пройтись по 1024 местам и подкрутить какую-то часть из них, а во второй пройтись вообще по всем местам использования ордера (система типов же поменялась) и подкрутить уже не 1024, а сильно больше.


    Более того, постоянно пропускается тот момент, что обычно все упаковано в API, и вызывается именно API, никто не делает стопятьсот проверок в 1024 местах. Обычно это просто 1024 места, где вызывается этот API


    dmitriid.comGitHubLinkedIn
    Re[38]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 06.02.15 15:14
    Оценка:
    Здравствуйте, genre, Вы писали:

    G>Здравствуйте, jazzer, Вы писали:


    J>>А разница проявляется в том, что, посещая эти 1024 места, ты легко можно 24 из них тупо пропустить, а еще в 128 — накосячить с изменениями. А если ты новое требование закодируешь в типе, то за тем, что ты посетил все 1024 места, проследит компилятор, и он просто не скомпилирует твою программу, пока ты не разберешься со всеми 1024 местами, причем пока не разберешься так, что компилятор будет удовлетворен.

    J>>Собственно, в этом весь смысл.

    G>Это с одной стороны правда, но ты как-то пропустил в моем вопросе слово "переписать систему типов".


    Признаться, я вообще с этим термином не знаком.

    G>Есть подозрение, что в одном варианте придется пройтись по 1024 местам и подкрутить какую-то часть из них, а во второй пройтись вообще по всем местам использования ордера (система типов же поменялась) и подкрутить уже не 1024, а сильно больше.


    G>Вот я и попросил пример опровергующий это ощущение.


    В смысле? было increase_amount(Order), стало increase_amount(ProcessedOrder) — откуда "сильно больше"?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[39]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 06.02.15 15:29
    Оценка: +1
    Здравствуйте, jazzer, Вы писали:

    J>В смысле? было increase_amount(Order), стало increase_amount(ProcessedOrder) — откуда "сильно больше"?


    было Order -> ProcessedOrder -> ClosedOrder

    стало Order -> PartialProcessedOrder -> ProcessedOrder -> ClosedOrder
    те придется переписать все что а) возвращало ордер, б) все что принимало ProcessedOrder

    а если форкфлоу у тебя нелинейный, то все, расходимся.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[40]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 06.02.15 16:03
    Оценка:
    Здравствуйте, genre, Вы писали:

    G>Здравствуйте, jazzer, Вы писали:


    J>>В смысле? было increase_amount(Order), стало increase_amount(ProcessedOrder) — откуда "сильно больше"?


    G>было Order -> ProcessedOrder -> ClosedOrder


    G>стало Order -> PartialProcessedOrder -> ProcessedOrder -> ClosedOrder

    G>те придется переписать все что а) возвращало ордер, б) все что принимало ProcessedOrder
    G>а если форкфлоу у тебя нелинейный, то все, расходимся.

    Пока что не видно, где "сильно больше".
    Была пачка функций, принимавших ProcessedOrder. Надо просто пройтись по ним и решить, они по-прежнему должны работать только на ProcessedOrder, или им достаточно и PartialProcessedOrder. И поменять тип аргумента.
    Но пройтись в любом случае надо было бы.
    Аналогично, везде, где раньше создавался ProcessedOrder, надо посмотреть, должен создаваться он или же надо создавать PartialProcessedOrder (а как иначе? в этом же суть добавлений, собственно, это тоже пришлось бы делать в любом случае)
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[41]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 06.02.15 16:11
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Пока что не видно, где "сильно больше".


    ну так минимум в два раза больше. и это в случае линейного воркфлоу. а если нелинейное? умножаем на количество входов-выходов из стейта.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[42]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 06.02.15 16:28
    Оценка: +5
    Здравствуйте, genre, Вы писали:

    G>ну так минимум в два раза больше. и это в случае линейного воркфлоу. а если нелинейное? умножаем на количество входов-выходов из стейта.


    Ну так это же надо в любом случае делать. Если требования меняются на таком уровне, то очевидно, что переколбашивать придется все. Что с типами, что без них. Просто с типами компилятор носом ткнет — где надо исправлять, а без них будем просто пребывать в счастливой уверенности, что все хорошо.
    Re[20]: Haskell нужен! (в Standard Chartered Bank)
    От: Klapaucius  
    Дата: 09.02.15 11:27
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>Если все эти проверки спрятаны в банальном API-вызове order:update_amount, то смысл? Вот у нас эта проверка существует уже лет шесть. Менялась один раз, весной. Второй раз будет меняться вот буквально через неделю.


    Вы спросили как проверить — я ответил. Теперь вы мне заявляете, что не нужно ничего проверять, писать, менять и вообще все тлен и суета сует. Естественно, проверка "стыкуемости" функций имеет смысл если она происходит сколько-то там раз и в нетривиальных сочетаниях.

    M>Главная проблема — не в мифических проблемах с типами, а в логике: на каком именно этапе сделать проверку, и какую именно проверку. Ну и написать тесты, проверяющие, что логика работает правильно


    Не понимаю, что за "мифические проблемы с типами". В обсуждаемом случае типы — это инструмент делегирования ответственности за проверку пользователю функции (другому программисту или себе в будущем, например). Т.е. функция требует того, что ей передают уже проверенные данные, если нет — получается ошибка во время компиляции. Т.е. это как раз относится к тому, что вы "главной проблемой" называете. Ну и это проверка лучше всякого теста в том плане про проверяет для целых пространств, а не каких то единичных точек в этих пространствах.

    M>Я не разбушевался. Я прошу простых внятных ответов на мои вопросы.


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

    K>> сказки не рассказывал и не обещал, что "все будет зашибись".


    M>Да неужели? Процитирую тебя:

    M>

    M>Чтоб испортить этот бесплатный праздник [внезапно появившийся на пустом месте — М.] нужно уже какие-то усилия по обходу/затиранию типов прилагать, строково-ориентированным программированием, всякими кастами, реинтерпретацией памяти, рефлексией и другими веселыми вещами. Т.е. программист уже должен быть не просто ленивым, а активно злонамеренным.

    M>Для типов есть легковесная верификация

    M>Она не перестает быть логикой, она представляется в форме, которая хорошо подходит для автоматической проверки.

    M>И т.п.

    Ну и где в процитированном обещания того, что "все будет зашибись"? Получается, что все ваши заявления о том, что я вам это говорил оказались обычной неправдой.

    M>На практике, когда начинаешь говорить с людьми, которые дают внятные ответы с примерами того, что они имеют в виду, ВНЕЗАПНО оказывается, что нет: или типы становятся слишком сложными, или часть проверок все равно в рантайме и т.п.


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

    M>Если ответ состоит из расказов и сказок про то, как все будет великолепно, то да, я это проигнорирую.


    Постарайтесь читать что вам пишут а не продолжать спорить с соломенным человеком. Или хотя бы не спихивать вину за это на других.
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[18]: Haskell нужен! (в Standard Chartered Bank)
    От: Klapaucius  
    Дата: 09.02.15 11:53
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Опиши, как ты это себе представляешь, учитывая, что состяние «Отправленный и непроверенный как написано в 4-м пункте» — это только одно из условий, после чего этот заказ будет использоваться в следующей проверке, для которого нужен другой набор состояний.


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

    M>То есть ты ожидаешь, что так не будет?


    Именно так. И чем больше спецификации будет в типах — тем больше оснований этого ожидать.

    M>Эти стопятосот условий описаны в одном API Вызывается оно из трех или четырех мест. Грубо говоря, order:set_amount(Order, Amount). Этот вызов возвращает или обновленный заказ или {error, Reason}.


    Речь идет об имплементации этого order:set_amount(Order, Amount) и других функций, определенных на Order. Если условий 100500, то проверок этих условий будет никак не меньше 100500, а скорее всего больше.

    M>С какого перепугу что-то надо править в 1024 местах вместо одного, известно только тебе одному.


    Потому, что обычно, применение функции определенной на каком-то типе встречается в коде несколько раз.
    И уж точно встречаются применения всех функций определенных на типе хотя-бы один раз, если эти функции не мертвый код, конечно.

    M>Ты пока не смог показать, как ты собираешься городить осмыслицу


    Ну так задайте вопросы по существу, а не повторяйте раз за разом, что я вам ничего не могу показать.

    K>>Тайпчек — это процесс нахождения логических ошибок.

    M>С какого перепугу? Тайпчек — это проверка, что все типы сходятся. К логическим ошибкам он не имеет никакого отношения.

    Тайпчек — это проверка того, что код является конструктивным доказательством теоремы — типа. Если это не имеет отношения к логическим ошибкам, то что тогда имеет?

    M>Ну ты лично написал с полдесятка сообщений, рассказывая, как все прекрасно


    Не юродствуйте, "рассказами о том как все прекрасно" вы называете объяснения когда и при каких условиях типы будут приносить пользу и насколько много или мало будет этой пользы.

    M>Ой. Уже внезапно не «проверка логики» и не «условия не будут противоречить», а «некоторый класс ошибок». Внезапно, да.


    Вы говорите неправду, это вовсе не "внезапно", про "некоторые классы ошибок" я говорил и раньше.
    И тут нет никакого отхода от "проверки логики". Какую часть спецификации вы выразите в типах — та и будет проверяться. Всю спецификацию выразите — всю проверите. Ничего не выразите — ничего не проверите.
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[3]: Haskell нужен! (в Standard Chartered Bank)
    От: vsb Казахстан  
    Дата: 09.02.15 11:55
    Оценка:
    Здравствуйте, Klapaucius, Вы писали:

    vsb>>Хаскель отличный язык, было бы здорово, если бы он взлетел хотя бы до уровня скалы.


    K>А какие есть признаки того, что между хаскелем и скалой в смысле "взлетания" есть какая-то заметная разница?


    Количество вакансий, количество обсуждений, вопросов в тех местах, которые я читаю.
    Re[4]: Haskell нужен! (в Standard Chartered Bank)
    От: Klapaucius  
    Дата: 09.02.15 12:27
    Оценка:
    Здравствуйте, vsb, Вы писали:

    vsb>Количество вакансий, количество обсуждений, вопросов в тех местах, которые я читаю.


    Кол-во вакансий — это еще может быть, хотя там количества и для скалы следовые. А кол-во обсуждений/вопросов чем отличается? Кол-во вопросов на стековерфлоу сопоставимо, число подписчиков в каком-нибудь реддите сопоставимо, объем правок на гитхабе сопоставим. И соответственно одинаково несопоставим со всеми этими показателями для яваскрипта и сиплюсплюса.
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[19]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 09.02.15 14:15
    Оценка:
    M>>Эти стопятосот условий описаны в одном API Вызывается оно из трех или четырех мест. Грубо говоря, order:set_amount(Order, Amount). Этот вызов возвращает или обновленный заказ или {error, Reason}.

    K>Речь идет об имплементации этого order:set_amount(Order, Amount) и других функций, определенных на Order. Если условий 100500, то проверок этих условий будет никак не меньше 100500, а скорее всего больше.


    K>Ну так задайте вопросы по существу, а не повторяйте раз за разом, что я вам ничего не могу показать.



    Вот вопрос по существу: http://rsdn.ru/forum/philosophy/5945374.flat
    Автор: Mamut
    Дата: 05.02.15


    Можно получить на него внятный ответ с примером решения без заумных фраз типа «Тайпчек — это проверка того, что код является конструктивным доказательством теоремы — типа.»,


    dmitriid.comGitHubLinkedIn
    Re[42]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 11.02.15 11:07
    Оценка: +1
    Здравствуйте, genre, Вы писали:

    G>Здравствуйте, jazzer, Вы писали:


    J>>Пока что не видно, где "сильно больше".


    G>ну так минимум в два раза больше. и это в случае линейного воркфлоу. а если нелинейное? умножаем на количество входов-выходов из стейта.

    Нет. Я так понял, что мы
    а) вводим новый тип — PartiallyProcessedOrder.
    б) меняем какую-то из функций, порождающих ордера — например, функция PerformDelivery(Order) теперь возвращает не ProcessedOrder, а PartiallyProcessedOrder, а для получения ProcessedOrder нужно позвать ещё и CollectFeedback(PartiallyProcessedOrder).
    в) компилируем, получаем X ошибок при попытках использования PartiallyProcessedOrder вместо ProcessedOrder.
    г) вычитываем каждую из них и меняем всё как надо — если функция реально требует ProcessedOrder, то надо обеспечить, чтобы до её вызова был вызван CollectFeedback. Если функции этого реально не надо, а достаточно иметь PartiallyProcessedOrder, то меняем её сигнатуру.
    После завершения у нас есть гарантия, что мы рассмотрели все переходы.
    Это имеет смысл, если X достаточно велико. Если X = 1, что очень часто бывает в бизнес логике, то никакого выигрыша не будет.
    Если X = 1000, то шансы забыть поставить if во всех 100 местах, где он реально нужен, весьма высоки.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[43]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 11.02.15 12:34
    Оценка: +1
    Здравствуйте, Sinclair, Вы писали:

    S>Это имеет смысл, если X достаточно велико. Если X = 1, что очень часто бывает в бизнес логике, то никакого выигрыша не будет.

    S>Если X = 1000, то шансы забыть поставить if во всех 100 местах, где он реально нужен, весьма высоки.

    Это все как-бы да. Я там выше с подобного примера и начал. Но как только я начинаю пытаться представлять как это все будет работать при воркфлоу сложнее линейного, а особенно если есть циклы, то сам выпадаю по StackOverflow.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[44]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 12.02.15 04:47
    Оценка: 42 (1) +1
    Здравствуйте, genre, Вы писали:
    G>Это все как-бы да. Я там выше с подобного примера и начал. Но как только я начинаю пытаться представлять как это все будет работать при воркфлоу сложнее линейного, а особенно если есть циклы, то сам выпадаю по StackOverflow.
    Как я понимаю, весь смысл статической проверки — в том, чтобы получить некоторые гарантии. Т.е. мы отлавливаем заведомые противоречия в программе. И весь вопрос — в том, какие противоречия мы хотим отловить.
    Классический пример — сложение строк с числами. Или секунд с килограммами. Или параметров с sql стейтментом.
    Чтобы противоречие вообще обнаружилось, нам нужно хотя бы два несогласующихся "утверждения".
    Т.е. вот мы в строке 1 предполагаем, что а — это строка, в строке 1111 умножаем а на 3.1415926, как будто это real.
    Такие вещи компилятор нам поможет отловить.
    Но если мы это a используем строго один раз — то ему нечему противоречить. Ну, вот если мы использовали 3.1415926 ровно один раз, то мы запросто можем в нём опечататься, и никакой компилятор нам не поможет. Он поможет если мы Pi используем 100500 раз — тогда мы можем заменить 100500 вхождений константы 3.1415926 на идентификатор Pi, и будем иметь гарантию хотя бы того, что во всей программе значение Pi одно и то же. Опечатки в названии идентификатора компилятор нам отловит.

    Особенно такие вещи помогают при внесении изменений — чтобы при модификации некоторого одного правила не сломались другие.
    В обычной бизнес-логике типа обработки заказов очень редко встречаются такие правила, которые вообще могли бы противоречить друг другу.
    То есть большинство правил — локальные, никак не связанные с другими.
    Именно поэтому компилятор вряд ли поможет отловить ошибки в бизнес-логике. Там основные ошибки — это противоречие программы и спецификации, и противоречие спецификации и того, чего хотел бизнес.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[45]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 12.02.15 09:18
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Именно поэтому компилятор вряд ли поможет отловить ошибки в бизнес-логике. Там основные ошибки — это противоречие программы и спецификации, и противоречие спецификации и того, чего хотел бизнес.


    О чем и речь.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[45]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 12.02.15 09:20
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Как я понимаю, весь смысл статической проверки — в том, чтобы получить некоторые гарантии. Т.е. мы отлавливаем заведомые противоречия в программе. И весь вопрос — в том, какие противоречия мы хотим отловить.


    Ну как раз обсуждение о том, насколько много ошибок можно отловить с помощью продвинутой статической типизации. Вроде как и много, даже логику на типах можно, но насколько реально это применимо в больших системах так и непонятно.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[46]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 12.02.15 09:49
    Оценка:
    Здравствуйте, genre, Вы писали:
    G>Ну как раз обсуждение о том, насколько много ошибок можно отловить с помощью продвинутой статической типизации. Вроде как и много, даже логику на типах можно, но насколько реально это применимо в больших системах так и непонятно.
    Ещё раз подчеркну: саму по себе логику на типах реализовывать малоинтересно. Просто потому, что это не даст преимуществ. Нет ничего ракетного в реализации компайл-тайм целочисленной арифметики на шаблонах С++, но она никак не поможет исправить ошибку в самой формуле. Она не будет лучше банального int a = 2*2-3.
    Интересно ловить какие-нибудь "свойства" этой логики. Например, соответствие размерностей в инженерных вычислениях.
    Или, например, отсутствие JS и SQL injections в коде странички.
    Тут — то же самое: есть одно правило типа "нельзя склеивать экранированные строки с неэкранированными", и очень много операций склейки, которые должны этому правилу удовлетворять.
    Вот тут поддержка компилятора — самое то.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[20]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 12.02.15 12:16
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Охо-хо. Логическая ошибка — это когда ты считаешь пеню в размере 50% от стоимости товара, а не 0.5%.

    Ок. А есть формальный критерий определения того, что эта пеня — ошибочная?
    Компилятору не может "не нравиться А". Он может только сравнивать А и Б.
    У вас в примере есть только А.
    Т.е. либо у нас есть более жёсткое правило, типа "пеня не может быть больше 5%", которое меняется гораздо реже чем правило типа "размер пени с 01.01.2011 равен 0.5%", либо есть ещё какой-то критерий проверки значения пени на корректность.

    M>Логическая ошибка — это когда позволяешь поднимать сумму в заказе выше определенной суммы, забыв проверить одно из условий.

    Если подъём суммы в заказе происходит в N местах, то статическая проверка может, к примеру, убедиться, что все условия всегда применены.
    А если подъем суммы происходит ровно в 1 месте, то ни статика, ни динамика никак не помогут ничего проверить.
    Собственно, тестирование — это и есть дописывание A' к тем А, для которых нету Б для сравнения.

    M>Да-да. Замени синус на товар

    А чем плохо? Можно очень много вещей провалидировать статически. Например, что ордер, отданный в процессинг — непустой (есть хотя бы один line item).
    Если в вашей системе есть куча мест, где из ордера по разным правилам изымаются позиции (сплит по поставщикам/складам; выбрасывание позиций, отсутствующих на складе на момент отправки, етк), то такая банальщина поможет предотвратить "array index out of bounds" где-то в недрах этого спагетти.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[21]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 12.02.15 21:46
    Оценка:
    M>>Охо-хо. Логическая ошибка — это когда ты считаешь пеню в размере 50% от стоимости товара, а не 0.5%.
    S>Ок. А есть формальный критерий определения того, что эта пеня — ошибочная?

    Есть: бизнес-задача.

    Или, если процитировать презентацию банка:

    Often working from verbal, ad hoc evolving spec. And at best from informal functional specs....
    [types..] Make wrong code impossible to write




    А бизнес-задача реально приходит в виде тикета, в котором написано что-то типа: «согласно изменению наших правил/законов/левой задней пятки мы должны установить пеню за просроченные более, чем на 30 дней, оплаты пеню в размере не больше 5% от оригинальной стоимости заказа».

    После чего хорошо если этот тикет кто-то заметит и начнет задавать доп. вопросы: а что делать, если заказ проведен в системе X (они обрабатываются оп-другому), а что если заказ оплачен частично, а что если заказ отправлен частями, а что если заказ находится в одном из статусов. Или прекрасное: а что, если между первой оплатой и «просроченной» человек стал protected person (политики, люди, находящиеся в программе защиты свидетелей и т.п.). То есть мы не знаем его адреса и не можем выслать ему предупреждение и т.п.

    После чего в тикете собираются все эти условия (если повезет, но мы последнее время пинаем всех вписывать всё и вся в тикет) — в вперед, барабанить код.

    S>Компилятору не может "не нравиться А". Он может только сравнивать А и Б.

    S>У вас в примере есть только А.
    S>Т.е. либо у нас есть более жёсткое правило, типа "пеня не может быть больше 5%", которое меняется гораздо реже чем правило типа "размер пени с 01.01.2011 равен 0.5%", либо есть ещё какой-то критерий проверки значения пени на корректность.

    Нет, у нас есть правило «пеня не может быть больше 5%» Иногда (как описал выше) есть доп. условия, но в реальности оно выглядит примерно так: http://rsdn.ru/forum/philosophy/5946213.1
    Автор: Mamut
    Дата: 06.02.15
    (это восстановлено по коду, потому что этого описания нет в одном месте).

    M>>Логическая ошибка — это когда позволяешь поднимать сумму в заказе выше определенной суммы, забыв проверить одно из условий.

    S>Если подъём суммы в заказе происходит в N местах, то статическая проверка может, к примеру, убедиться, что все условия всегда применены.
    S>А если подъем суммы происходит ровно в 1 месте, то ни статика, ни динамика никак не помогут ничего проверить.
    S>Собственно, тестирование — это и есть дописывание A' к тем А, для которых нету Б для сравнения.

    Ну, я как бы постоянно вокруг этого прыгаю, выделенное с первого раза по-моему не сказал никто вообще Еще два человека сказали это после долгого обсуждения

    M>>Да-да. Замени синус на товар

    S>А чем плохо? Можно очень много вещей провалидировать статически. Например, что ордер, отданный в процессинг — непустой (есть хотя бы один line item).
    S>Если в вашей системе есть куча мест, где из ордера по разным правилам изымаются позиции (сплит по поставщикам/складам; выбрасывание позиций, отсутствующих на складе на момент отправки, етк), то такая банальщина поможет предотвратить "array index out of bounds" где-то в недрах этого спагетти.

    Куча мест есть, но они упакованы в один API в модуле Goods Максимум, что туда передается, это заказ и новые/изменяемые товары У нас на удивление мало случаев, когда какие-то проверки на какие-то условия копипастой раскиданы по ста местам. Обычно есть некий API, куда передается объект и проверки делаются там.

    Ой. Кстати. Только сегодня пришел баг с прекрасным примером именно логической ошибки.

    Когда мы отправляем физическое письмо с информацией про товар, мы выставляем счет за отсылку этого письма продавцу. Если это письмо повторно отсылается нашей тех. поддержкой из нашего внутреннего CRM, то этот счет не выставляется. Появился REST API, который позволяет это сделать из новой CRM, которая сейчас пилится. ВНЕЗАПНО оказалось, что вызов REST API выставляет счет за письма, хотя не должен.

    А все просто

    
    %% используемый по всей системе код
    order_communication:send_invoice() ->
       ....
       FactoringFees = config:read(Merchant, factoring_fees),
       Inv = invoice:set_factoring_fee(OriginalInvoice, FactoringFees),
       invoice_send:send(Inv).
    
    
    %% код на странице CRM'а
    order_show_yaws:send_mail(SiteState) ->
      ...
      Inv = case is_customer_support(SiteState) of
               true -> OriginalInvoice;
               false ->
                 FactoringFees = config:read(Merchant, factoring_fees),
                 invoice:set_factoring_fee(Invoice, FactoringFees),
            end,
      invoice_send:send(Inv).
    
    %% код в новом вызове REST API
    restapi_order_mail:call() ->
      ...
      order_communication:send_invoice(Inv).




    Тут не спасет ничего, кроме живительного осинового кола, направленного далеко не в сердце. Самое страшное, что этот первые два куска кода были написаны гуру Эрланга, имена которых выбиты в скрижалях по всему Эрлангу (его библиотекам, документации и т.п.)


    dmitriid.comGitHubLinkedIn
    Re[47]: Haskell нужен! (в Standard Chartered Bank)
    От: Klapaucius  
    Дата: 17.02.15 12:15
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Ещё раз подчеркну: саму по себе логику на типах реализовывать малоинтересно. Просто потому, что это не даст преимуществ. Нет ничего ракетного в реализации компайл-тайм целочисленной арифметики на шаблонах С++, но она никак не поможет исправить ошибку в самой формуле. Она не будет лучше банального int a = 2*2-3.


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

    Допустим, мы закодировали целые числа как типы Z и S (n :: Nat) и кайнд Nat:
    data Nat = Z | S Nat

    У нас есть библиотека (singletons), которая нагенерит нам для этих типов всякого бойлерплейта, и библиотеки со всякими утилитами, которые понадобится для дальнейших "доказательств" (насколько вообще можно говорить о доказательствах в языке без проверки тотальности).
    так же мы можем в типах и арифметику закодировать:
    singletons [d|
     (+) :: Nat -> Nat -> Nat
     Z   + n = n
     S m + n = S (m + n)
    
     (-) :: Nat -> Nat -> Nat
     n   - Z   = n
     S n - S m = n - m
     Z   - S _ = Z
    
     (*) :: Nat -> Nat -> Nat
     Z   * _ = Z
     S n * m = n * m + m
     |]

    Закодированная в типах арифметика выглядит существенно страшнее, но опять таки есть библиотека, которая "промоутит" на уровень типов обычный код.
    Обращаю внимание, что тут речь идет об обычном языке без всяких завтипов — хаскеле. В языках с завтипами всякие костыли не нужны. Там обычный код и "кодирование на уровне типов" — это одно и то же.
    После того, как арифметика у нас есть, можно приступить к доказательствам.
    некоторые свойства тайпчекер и так докажет:
    plusZL :: SNat n -> Z :+: n :=: n -- то, что мы доказываем 0 + n = n
    plusZL _ = Refl -- компилятор конструирует доказательство сам (думаю, понятно почему)

    В других случаях доказательство придется конструировать вручную. Ассоциативность, например:
    plusAssociative :: SNat n -> SNat m -> SNat l
                    -> n :+: (m :+: l) :=: (n :+: m) :+: l
    plusAssociative SZ     _ _ = Refl
    plusAssociative (SS n) m l =
      start (sS n %+ (m %+ l))
        =~= sS (n %+ (m %+ l))
        === sS ((n %+ m) %+ l)  `because` cong' sS (plusAssociative n m l)
        =~= sS (n %+ m) %+ l
        =~= (sS n %+ m) %+ l

    Тут на s и % начинаются названия "синглетонизированных" функций и типов синглетонов — типов, с помощью которых мы преодолеваем разделение на типы и "обычный код" во всяких недоязыках вроде хаскеля (синглетоны и "синглетонизированные" функции генерируются автоматически как и результат промоушена функций) — в языках с завтипами разделения нет и синглетоны не нужны.
    Ну и так далее. На самом деле все эти свойства есть в библиотеке type-natural
    Естественно, свойства арифметики мы и так знаем, они и доказаны давным-давно. Но, разумеется, можно в типах закодировать не только арифметику, но и то, свойства чего мы еще не доказали, ну и, соответственно, с помощью тайпчекера "доказать".
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[48]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 18.02.15 10:28
    Оценка:
    Здравствуйте, Klapaucius, Вы писали:

    K>Какая-то странная постановка вопроса. Кодируя целочисленную арифметику в типах мы получаем возможность проверить свойства целочисленной арифметики.

    К счастью, обычно свойства целочисленной арифметики входят в поставку компилятора, и шансов поломать их неожиданной программой у нас мало.
    Вот, допустим, перед вами поставили задачу "решить квадратное уравнение".
    То есть на входе — коэффициенты a, b, c, на выходе — все корни уравнения.

    Максимум, который сможет нам дать тайпчекер — предотвратить попытку извлечения квадратного корня из отрицательного детерминанта.
    А вот, скажем, то, что вместо 4 я опечатаюсь и напишу 3, никакой тайпчекер не отловит. Или я ошибаюсь?
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[49]: Haskell нужен! (в Standard Chartered Bank)
    От: D. Mon Великобритания http://thedeemon.livejournal.com
    Дата: 18.02.15 16:09
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Максимум, который сможет нам дать тайпчекер — предотвратить попытку извлечения квадратного корня из отрицательного детерминанта.

    S>А вот, скажем, то, что вместо 4 я опечатаюсь и напишу 3, никакой тайпчекер не отловит. Или я ошибаюсь?

    По идее, мы можем в типе функии указать "возвращает такое число х, что х*х = input", тогда при ошибке в формуле код не скомпилируется. Только вот с вещественными числами так работать дело гиблое, в задачах с целыми оно реальнее.

    Например, функция поиска подстроки на ATS у меня такой тип имела:
    fn search {n,m:nat | m <= n}
      (str : string n, sub : string m) : [p:int | p <= n - m] int p

    Т.е. "возвращает такое целое p, что оно не больше n — m, где n и m это длины переданных строк".
    Re[49]: Haskell нужен! (в Standard Chartered Bank)
    От: Klapaucius  
    Дата: 19.02.15 10:12
    Оценка: 70 (1)
    Здравствуйте, Sinclair, Вы писали:

    S>К счастью, обычно свойства целочисленной арифметики входят в поставку компилятора


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

    S>и шансов поломать их неожиданной программой у нас мало.


    Ну так в моем посте буквально это и написано + плюс ответ на возражение, хотя возможно и недостаточно развернутый:

    Естественно, свойства арифметики мы и так знаем, они и доказаны давным-давно. Но, разумеется, можно в типах закодировать не только арифметику, но и то, свойства чего мы еще не доказали, ну и, соответственно, с помощью тайпчекера "доказать".

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

    S>Вот, допустим, перед вами поставили задачу "решить квадратное уравнение".

    S>То есть на входе — коэффициенты a, b, c, на выходе — все корни уравнения.

    S>Максимум, который сможет нам дать тайпчекер — предотвратить попытку извлечения квадратного корня из отрицательного детерминанта.

    S>А вот, скажем, то, что вместо 4 я опечатаюсь и напишу 3, никакой тайпчекер не отловит. Или я ошибаюсь?

    Какие пред или пост условия заданы для функции — то и проверит.
    Т.е. разница между этими вашими примерами не столько возможностями тайпчекера определяется, сколько вашей способностью сформулировать проверяемые свойства. Для функции, которая из a b и дискриминанта вычисляет корни уравнения, вы сформулировали условие D >= 0. Значит есть что проверять. А если вы условия не формулируете — то тут и проверять нечего, хоть тайпчекером, хоть тестами, с той поправкой, что какие-то условия могут быть выведены без всякого указания. Т.е. есть всякие средства получения таких условий без вашей помощи вроде систем вывода типов, в том числе и refinement типов (на подобии {p:int | p <= n — m} из соседнего поста) вроде liquid types. Есть еще всякие системы эвристического поиска свойств для некоего набора функций. Так вот, эти средства получения условий для проверки автоматически — действительно ограничены и далеко без помощи человека не уходят. В полуавтоматическом же режиме, т.е. с помощью человека как при формулировании условий, так и при доказательстве можно зайти, наоборот, очень далеко.
    Другое дело, что перспективы что-то проверить, "доказать", о чем-то рассуждать и вообще сохранить рассудок в случае плавучки не радужные.
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[47]: Haskell нужен! (в Standard Chartered Bank)
    От: vdimas Россия  
    Дата: 19.02.15 15:06
    Оценка: 70 (1)
    Здравствуйте, Sinclair, Вы писали:

    S>Ещё раз подчеркну: саму по себе логику на типах реализовывать малоинтересно. Просто потому, что это не даст преимуществ. Нет ничего ракетного в реализации компайл-тайм целочисленной арифметики на шаблонах С++, но она никак не поможет исправить ошибку в самой формуле. Она не будет лучше банального int a = 2*2-3.


    Это при потере размерностей не лучше. Да и то, у тебя тут левая и правая части выражения обложены тем ограничением, что правая часть должна быть приводима к типу левой.

    В примере же с ордером условная "правая часть" вычисляется в одном месте, а подаётся в условную "левую часть" в другом месте. Типы должны соответствовать друг другу.


    S>Интересно ловить какие-нибудь "свойства" этой логики. Например, соответствие размерностей в инженерных вычислениях.


    Тип текущего результата вычислений тоже может обладать размерностью.
    ИМХО, вряд ли у того же ордера будет более десятка размерностей.

    Вот, поупражнялся:

    using System;
    
    namespace StrongTypedOrder
    {
        public class Any<T> {}
        public class Not<T> : Any<T> { }
    
        public class Checked : Any<Checked> { }
        public class Approved : Any<Approved> { }
        public class Closed : Any<Closed> { }
    
        class OrderProcessor
        {
            public void SendInvoice<X>(Order<Checked, X, Not<Closed>> o) 
                where X : Any<Approved>
            {
                OrderData od = o.Data;
                Console.WriteLine("Send Address: {0}, amount: {1}", od.Address, od.Amount);
            }
    
            public void Execute(Order<Checked, Approved, Not<Closed>> o)
            {
                OrderData od = o.Data;
                Console.WriteLine("Execute Address: {0}, amount: {1}", od.Address, od.Amount);
            }
    
            public void Archive(Order<Checked, Approved, Closed> o)
            {
                OrderData od = o.Data;
                Console.WriteLine("Archive Address: {0}, amount: {1}", od.Address, od.Amount);
            }
            
            public Order<Checked, X, Not<Closed>> 
                Check<X>(Order<Not<Checked>, X, Not<Closed>> o)
                where X : Any<Approved>
            {
                return new Order<Checked, X, Not<Closed>>(o.Data);
            }
    
            public Order<Checked, Approved, Not<Closed>>
                Approve(Order<Checked, Not<Approved>, Not<Closed>> o)
            {
                return new Order<Checked, Approved, Not<Closed>>(o.Data);
            }
    
            public Order<X, Y, Closed>
                Close<X, Y>(Order<X, Y, Not<Closed>> o)
                where X : Any<Checked>
                where Y : Any<Approved>
            {
                return new Order<X, Y, Closed>(o.Data);
            }
    
            public Order<Not<Checked>, Not<Approved>, Not<Closed>> 
                Create()
            {
                return new Order<Not<Checked>, Not<Approved>, Not<Closed>>(new OrderData());
            }
        }
    
        public class OrderData
        {
            public double Amount { get; set; }
            public string Address { get; set; }
        }
    
        public struct Order<TChecked, TApproved, TClosed>
            where TChecked : Any<Checked>
            where TApproved : Any<Approved>
            where TClosed : Any<Closed>
        {
            internal Order(OrderData data)
                : this()
            {
                this.Data = data;
            }
    
            public OrderData Data { get; private set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                var p = new OrderProcessor();
                var order = p.Create();
    
                order.Data.Address = "XXX";
                order.Data.Amount = 42;
    
                // p.SendInvoice(order);        // compilation error
    
                var checkedOrder = p.Check(order);
                p.SendInvoice(checkedOrder);    // OK
    
                // p.Execute(checkedOrder);     // compilation error
    
                var approvedOrder = p.Approve(checkedOrder);
                p.Execute(approvedOrder);       // OK
    
                // p.Archive(approvedOrder);    // compilation error
    
                var closedOrder = p.Close(approvedOrder);
                p.Archive(closedOrder);         // OK
            }
        }
    }
    Re[48]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 19.02.15 17:59
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    V>В примере же с ордером условная "правая часть" вычисляется в одном месте, а подаётся в условную "левую часть" в другом месте. Типы должны соответствовать друг другу.

    Не факт.

    V>Тип текущего результата вычислений тоже может обладать размерностью.

    V>ИМХО, вряд ли у того же ордера будет более десятка размерностей.

    V>
        class Program
    V>    {
    V>        static void Main(string[] args)
    V>        {
    V>            var p = new OrderProcessor();
    V>            var order = p.Create();
    
    V>            order.Data.Address = "XXX";
    V>            order.Data.Amount = 42;
    
    V>            // p.SendInvoice(order);        // compilation error
    
    V>            var checkedOrder = p.Check(order);
    V>            p.SendInvoice(checkedOrder);    // OK
    
    V>            // p.Execute(checkedOrder);     // compilation error
    
    V>            var approvedOrder = p.Approve(checkedOrder);
    V>            p.Execute(approvedOrder);       // OK
    
    V>            // p.Archive(approvedOrder);    // compilation error
    
    V>            var closedOrder = p.Close(approvedOrder);
    V>            p.Archive(closedOrder);         // OK
    V>        }
    V>    }
    V>}
    V>

    И какие классы ошибок мы отловим? Отправку инвоиса по непроверенному ордеру? Ну так у нас ровно две строки кода: отправка и проверка. С тем же успехом мы можем просто забыть поставить в сигнатуре SendInvoice нужный предикат.
    Такая проверка имеет смысл тогда, когда у нас есть условия, которые можно проверить многократно — например, куча путей исполнения, в которых может то встречаться, то не встречаться Check. Тогда компилятор поможет нам убедиться, что нет таких путей, которые ... и так далее.
    А в реальном order flow всё скорее всего ещё неинтереснее — разные этапы этого workflow берут ордер не из параметров, а из базы, и там никаких статически верифицируемых свойств нету.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[49]: Haskell нужен! (в Standard Chartered Bank)
    От: vdimas Россия  
    Дата: 19.02.15 20:37
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>И какие классы ошибок мы отловим? Отправку инвоиса по непроверенному ордеру? Ну так у нас ровно две строки кода: отправка и проверка. С тем же успехом мы можем просто забыть поставить в сигнатуре SendInvoice нужный предикат.


    Можем. Тут же дело (как ты правильно ранее заметил) в масштабируемости. Если SendInvoice вызывается более, чем из одного места, то вот тебе и профит. А если взять десяток координат (а не 3), то получим пространство в 1024 комбинации. А кол-во возможных переходов (путей) — еще на многие-многие порядки больше. Комбинаторика-с. На типах же достаточно будет проверить всего столько кейзов, сколько существует БАЗОВЫХ операций над ордером, двигающих его из начального состояния во все достижимые в пространстве состояний, закодированных типами. Т.е. это будет некий "пояс безопасности", которым может оперировать уже вышестоящая логика сколь угодно высокой комбинаторной сложности, где разница статики vs динамики будет в полный рост. Например, в какой-то ветке сложного "слаботипизированного" решения по цепочке if-ов никогда не доходили до SendInvoice в тестах в одном из самых сложных алгоритмов, а потом у заказчика всё упало в боевых условиях на самой важной "сделке века".


    S>Такая проверка имеет смысл тогда, когда у нас есть условия, которые можно проверить многократно — например, куча путей исполнения, в которых может то встречаться, то не встречаться Check. Тогда компилятор поможет нам убедиться, что нет таких путей, которые ... и так далее.


    Пральна. Потому что не все 1024 пространства состояний валидны и не все возможные "пути" смены состояний валидны. Накладывая ограничения, мы отсекаем малюсенькое подмножество валидных состояний и путей в них от чудовищного комбинаторного мн-ва невалидных. Вот что мы делаем.


    S>А в реальном order flow всё скорее всего ещё неинтереснее — разные этапы этого workflow берут ордер не из параметров, а из базы, и там никаких статически верифицируемых свойств нету.


    Есть. ))
            public Order<Checked, AnyApproved, AnyClosed>
                MakeChecked<AnyApproved, AnyClosed>(Order<Not<Checked>, AnyApproved, AnyClosed> o)
                where AnyApproved : Any<Approved>
                where AnyClosed : Any<Closed>
            {
                return new Order<Checked, AnyApproved, AnyClosed>(o.Data);
            }


    Разумеется, есть много техник перехода тип <=> данные и наоборот (визитор, размеченное объединение, всевозможные виды IoC, в т.ч. некоторые с громкими аббревиатурами в ФП, которые делают вид, будто они вовсе не IoC, а нечто самостоятельно существующее). ))

    Но не в этом суть. Это две противоборствующие парадигмы (кодировать признак в тип или в данные?), где в реальной разработке используется некий компромисс. Чем больше закодировано в данных, тем больше рантайм-полиморфизма требуется, но и доступно тоже, т.е. тем выше уровень абстракции на уровне объектов/интерфейсов в смысле абстракций ООП, что есть бенефит для, скажем, многих чисто-ООП паттернов и дизайнов на их основе. Скажем, AST, построенное на абстрактной базе, должно явно кодировать информацию о типах узлов в данных (или в виртуальных методах, что одно и то же), чтобы это AST было пригодно для полезной обработки. Я называю такой подход "сливать в бутылочное горлышко, а затем разливать из него". Кста, как раз тот случай, когда паттерн-матчинг заруливает визитор. В случае же строго-типизированного AST, проход по нему возможен только через различные техники визиторов/колбэков/IoC, что не всегда удобно, но зато имеем лучшую типобезопасность. В общем, в реальной большой проге обычно встречаются оба подхода и оба являются компромиссами, ес-но, в рамках имеющихся мейнстримовых языков, без явной поддержки зависимых типов.
    Re[49]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 20.02.15 13:13
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>А в реальном order flow всё скорее всего ещё неинтереснее — разные этапы этого workflow берут ордер не из параметров, а из базы, и там никаких статически верифицируемых свойств нету.


    Есть, через if, как вот здесь:
    http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[50]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 21.02.15 06:17
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Здравствуйте, Sinclair, Вы писали:


    S>>А в реальном order flow всё скорее всего ещё неинтереснее — разные этапы этого workflow берут ордер не из параметров, а из базы, и там никаких статически верифицируемых свойств нету.


    J>Есть, через if, как вот здесь:

    J>http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15

    Не нашёл.
    Упрощу вопрос: вот у нас есть метод LoadOrder(int orderId). Какой тип он возвращает?
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[51]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 21.02.15 06:47
    Оценка:
    S>Упрощу вопрос: вот у нас есть метод LoadOrder(int orderId). Какой тип он возвращает?

    Дай я тебе отвечу Wolfhound'ом
    Автор: WolfHound
    Дата: 09.02.15


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


    ©



    dmitriid.comGitHubLinkedIn
    Re[51]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 21.02.15 06:53
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    J>>Есть, через if, как вот здесь:

    J>>http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15

    S>Не нашёл.
    S>Упрощу вопрос: вот у нас есть метод LoadOrder(int orderId). Какой тип он возвращает?

    Ну тут много вариантов.
    Можно вернуть вариант (хм... непереводимая игра слов ), в котором будет зашит статический тип ордера. Это если мы хотим все свойства проверить в самом LoadOrder (что маловероятно — все-таки нам что-то делать с ордером хочется каждый раз разное — нет смысла пихать все это в LoadOrder).
    После этого, если это правильный вариант (т.е. со статическим диспатчем, как в Boost.Variant), у нас появляется возможность переложить контроль на компилятор. Но это не такой хороший варинат, как мой — так как нужно предусмотреть ветки визитора варианта для "неправильного" типа, а мы хотим, что оно вообще не компилировалось.
    Другой вариант — это передавать continuation в LoadOrder — тогда он будет называться LoadAndProcessOrder(int orderId, function whatToDo). Но, опять же, в С++ это напрямую не сработает из-за энергичной стратегии воплощения шаблонов — будет сделана попытка скомпилировать все ветки, и с правильным типом, и с неправильным, и будет выдана ошибка, либо же нам надо предусмотреть какие-то обходные пути, типа "компилируется, но ничего не делает" — что просто замаскирует ошибку, либо "компилируется, но бросает исключение" — но это рантайм, а мы же боремся за проверку во время компиляции...

    А можно вернуть "просто ордер", как в моем примере по ссылке — но ты с ним ничего реального не сможешь сделать. Вернее, сможешь, но только после проверки необходимых свойств — и попытки вызвать код для ордера, у которого необходимые свойства не проверены, просто не скомпилируются.
    Имхо, это наилучший вариант.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[52]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 21.02.15 21:52
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Но, опять же, в С++ это напрямую не сработает из-за энергичной стратегии воплощения шаблонов — будет сделана попытка скомпилировать все ветки, и с правильным типом, и с неправильным, и будет выдана ошибка, либо же нам надо предусмотреть какие-то обходные пути, типа "компилируется, но ничего не делает" — что просто замаскирует ошибку, либо "компилируется, но бросает исключение" — но это рантайм, а мы же боремся за проверку во время компиляции...


    Если обработка ордера не требует наличия тех или иных свойств — то никаких ошибок не будет, точно также как и в твоём варианте не нужно будет писать PROP_IF/PROP_ELSE.
    Если же при обработке ордера нужно будет вызывать функцию у которой в precondition будет требование конкретного свойства (типа order_is_processed) — то компилятор заставит пользователя продумать и описать реакцию на разные состояния, и нарушение precondtion в runtime не пройдёт. Точно также как и в твоём варианте компилятор заставит пользователя продумать содержание веток PROP_IF + PROP_ELSE.
    Никакой концептуальной разницы я здесь не вижу. Разница только в синтаксическом сахаре
    Re[53]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 22.02.15 03:18
    Оценка:
    Здравствуйте, Evgeny.Panasyuk, Вы писали:

    EP>Если же при обработке ордера нужно будет вызывать функцию у которой в precondition будет требование конкретного свойства (типа order_is_processed) — то компилятор заставит пользователя продумать и описать реакцию на разные состояния, и нарушение precondtion в runtime не пройдёт. Точно также как и в твоём варианте компилятор заставит пользователя продумать содержание веток PROP_IF + PROP_ELSE.

    EP>Никакой концептуальной разницы я здесь не вижу. Разница только в синтаксическом сахаре

    Разница в том, что _все_ функции придется написать компилируемыми на _все_ возможные состояния ордера (например, static_visitor должен быть компилируемым со всеми типами варианта) — в то время как мы хотели бы получать ошибку при попытке вызвать функцию для неправильного ордера. Моей первой идеей было как раз сделать все на continuations — и я столкнулся именно с этой проблемой: функция-продолжение должна быть компилируемой и с правильным типом, и с неправильным, причем под компилируемостью подразумевается и отсутствие static_assert.
    Единственный действительно рабочий вариант, который я нашел — это разнести типы синтаксически (по веткам if/else). Он не такой элегантный, как с продолжениями (хотя тоже как посмотреть — он обеспечивает естественный if/else flow), но дает именно то, что нужно.
    Мы ведь хотим получать ошибку компиляции при попытке позвать не ту функцию, а с continuations мы передаем ее всегда, независимо от типа — и она должна всегда компилироваться, для всех вариантов свойств.

    Разве что ты имеешь в виду разбить этот if/else по веткам static_visitor-а варианта (и тогда будет ошибка компиляции при попытке вызова ограниченной функции не из той ветки визитора) — но это, имхо, менее наглядно, чем прямой if/else. Но работать будет.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[54]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 22.02.15 08:30
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Разве что ты имеешь в виду разбить этот if/else по веткам static_visitor-а варианта (и тогда будет ошибка компиляции при попытке вызова ограниченной функции не из той ветки визитора)


    Да, именно так. То есть в случае variant/continuation будет код вида:
    void function_which_requires_processed_order(Order<prcoessed> &x);
    
    // ...
    {
        apply(order, [](Order<prcoessed> &x)
        {
            function_which_requires_processed_order(x);
            // ...
        },
        [](auto &x)
        {
            // "ELSE" branch
            // special processing, noop, exception or whatever
        });
    }
    А в случае PROP_IF:
    template<typename O>
    enable_if_t<Processed<O>> function_which_requires_processed_order(O &o);
    
    // ...
    {
        PROP_IF(order, Processed)
        {
            function_which_requires_processed_order(order);
            // ...
        }
        PROP_ELSE
        {
            // "ELSE" branch
            // special processing, noop, exception or whatever
        };
    }

    То есть структура и возможности по обработке веток примерно одинаковые.

    J>- но это, имхо, менее наглядно, чем прямой if/else. Но работать будет.


    Несомненно это менее наглядно и удобно. И если есть какая-то логика которая хорошо ложится на зависимые типы — то хорошо бы иметь библиотеку типа PROP_IF.
    variant и continuation я показывал как примеры техник реализации — то что это вообще возможно (ведь высказывались сомнения на этот счёт) — а не как законченные решения.
    Re[52]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 24.02.15 10:05
    Оценка: +1
    Здравствуйте, jazzer, Вы писали:
    J>Можно вернуть вариант (хм... непереводимая игра слов ), в котором будет зашит статический тип ордера.
    Конкретнее?
    J>Это если мы хотим все свойства проверить в самом LoadOrder (что маловероятно — все-таки нам что-то делать с ордером хочется каждый раз разное — нет смысла пихать все это в LoadOrder).
    Нет, мы не хотим все свойства проверять в самом LoadOrder. Например, проверку на fraud нужно сделать один раз — слишком дорого каждый раз обращаться к сервисам.

    J>После этого, если это правильный вариант (т.е. со статическим диспатчем, как в Boost.Variant), у нас появляется возможность переложить контроль на компилятор.

    Не понимаю. Тип, тип какой?
    J>Другой вариант — это передавать continuation в LoadOrder — тогда он будет называться LoadAndProcessOrder(int orderId, function whatToDo).
    Это понятно — но дальше-то что? вот эта WhatToDo — она какого типа?

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

    Пока непонятно. Получается, мы не можем персисить ордер за пределы текущего процесса — а это очень плохо, т.к. типичные workflow ордеров катастрофически медленные. Требование держать всё в памяти — невыполнимо.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[53]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 24.02.15 10:41
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    Сорри, ты правда прочитал мой пост
    Автор: jazzer
    Дата: 10.02.15
    ? Внимательно? А то ты задаешь вопросы, на которые есть ответы прямо там, причем в примерах кода.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[53]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 24.02.15 15:03
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    так и быть, отвечу здесь, хотя не уверен, что в коня корм...

    S>Здравствуйте, jazzer, Вы писали:

    J>>Можно вернуть вариант (хм... непереводимая игра слов ), в котором будет зашит статический тип ордера.
    S>Конкретнее?
    boost::variant.
    J>>Это если мы хотим все свойства проверить в самом LoadOrder (что маловероятно — все-таки нам что-то делать с ордером хочется каждый раз разное — нет смысла пихать все это в LoadOrder).
    S>Нет, мы не хотим все свойства проверять в самом LoadOrder. Например, проверку на fraud нужно сделать один раз — слишком дорого каждый раз обращаться к сервисам.
    Ну так можно результат проверки "заперсистить" и потом смотреть на него.

    J>>После этого, если это правильный вариант (т.е. со статическим диспатчем, как в Boost.Variant), у нас появляется возможность переложить контроль на компилятор.

    S>Не понимаю. Тип, тип какой?
    тип чего? варианта? ордер со всеми возможными свойствами (но это комбинаторный взрыв типов, как раз поэтому я за это не агитирую).
    J>>Другой вариант — это передавать continuation в LoadOrder — тогда он будет называться LoadAndProcessOrder(int orderId, function whatToDo).
    S>Это понятно — но дальше-то что? вот эта WhatToDo — она какого типа?
    функциональный объект, в которм operator() перегружен по типам ордера (т.е. по типам свойств).
    Для примера посмотри тут http://www.boost.org/doc/libs/1_57_0/doc/html/variant/tutorial.html#variant.tutorial.basic (найди на странице times_two_visitor и times_two_generic)


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

    S>Пока непонятно. Получается, мы не можем персисить ордер за пределы текущего процесса — а это очень плохо, т.к. типичные workflow ордеров катастрофически медленные. Требование держать всё в памяти — невыполнимо.

    Посмотри на мой код
    Автор: jazzer
    Дата: 10.02.15
    по ссылке все же (я понимаю, что лень, но все-таки). Там есть свойства, которые сидят прямо в ордере, и замечательно "персистятся".
    Так что сделал check_fraud, записал результат order.fraud_checked=true, order.fraud_check_result=true, заперсистил. У тебя уже новый тип, как после долгой проверки, так и после загрузки "заперсисченного" ордера из БД, непосредственно из order.fraud_check_result.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[51]: Haskell нужен! (в Standard Chartered Bank)
    От: Klapaucius  
    Дата: 25.02.15 10:12
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Упрощу вопрос: вот у нас есть метод LoadOrder(int orderId). Какой тип он возвращает?


    Это просто, как уроки не учить.
    loadOrder :: (ЭтоНесущественныеДеталиРеализации k) => Int -> SomeSing k

    Возвращает тип `SomeSing`
    data SomeSing (kproxy :: KProxy k) where
        SomeSing :: Sing (a :: k) -> SomeSing ('KProxy :: KProxy k)

    Тут не обращайте внимание на `kproxy`, ключевой момент что на входе конструктора `SomeSing` есть `a`, а между `data` и `where` нету — это экзистенциальный тип.

    SomeSing конструируется при загрузке, там же все что надо и проверяется в рантайме. Мы все данные об `Order` оформляем как синглетон `SOrderDescription` типа `OrderDescription`, который и передаем в конструктор `SomeSing`. После этого мы можем элиминировать `SomeSing` паттерн-матчингом и получить синглетон, а значит и описывающий `Order` тип:
    case order of SomeSing order' -> procOrder order'

    Где тип у ф-и
    procOrder :: Sing (order :: OrderDescription) -> Result

    все, дальше у нас все статически типизировано описанием `Order` полученным в рантайме. Т.е. рантайм проверка одна, дальше ее результат переносится типами.

    Чтоб понятно было, как это работает продемонстрирую минимальный полный работающий пример. Вот в этой ветке
    http://rsdn.ru/forum/decl/5378899.1
    Автор: D. Mon
    Дата: 30.11.13
    шла дискуссия о том, что нельзя сделать в принципе в статтипизированном языке, а в бестиповом — можно. И там ответ написан на языке с завтипами.
    Это же можно делать и на языке без завтипов:

    {-# LANGUAGE PolyKinds, DataKinds #-}
    {-# LANGUAGE TypeFamilies, GADTs #-}
    
    {-# LANGUAGE NPlusKPatterns #-}
    
    {-# LANGUAGE TypeOperators #-}
    
    import Data.Singletons
    import Data.Singletons.Prelude
    
    data Nat = Z | S Nat -- Nat это и тип и кайнд (тип типов)
    
    integerToNat 0 = Z
    integerToNat (n + 1) = S (integerToNat n)
    
    -- Все что ниже генерируется автоматически
    -- genSingletons [''Nat]
    -- но приведено для образовательных целей
    
    -- это синглетон для Nat
    data instance Sing (n :: Nat) where
      SZ :: Sing Z
      SS :: Sing n -> Sing (S n)
    
    -- механизм трансляции между значениями типа Nat и значениями синглетон-типа
    instance SingKind ('KProxy :: KProxy Nat) where
      type DemoteRep ('KProxy :: KProxy Nat) = Nat
    
      fromSing SZ = Z
      fromSing (SS n) = S (fromSing n)
      
      toSing Z = SomeSing SZ
      toSing (S n) = case toSing n :: SomeSing ('KProxy :: KProxy Nat) of
        SomeSing k -> SomeSing (SS k)
    
    -- конец автоматически генерируемого бойлерплейта
    
    -- функция создает вложенные списки (если n > 0)
    create :: Sing (n :: Nat) -> MyType n
    create SZ = 0
    create (SS x) = [create x]
    
    -- разных типов в зависимости
    -- от передаваемого ей значения.
    type family MyType (a :: Nat)
    type instance MyType Z = Int
    type instance MyType (S x) = [MyType x]
    
    -- функция сериализует в строку эти списки (разных типов)
    -- тут от передаваемого значения зависит тип другого принимаемого значения
    useValue :: Sing (n :: Nat) -> MyType n -> String
    useValue SZ v = show v
    useValue (SS x) v = "[" ++ (concat $ map (useValue x) v) ++ "]"
    
    main = do
      ns <- getLine -- пользователь вводит число с клавиатуры
      let n = integerToNat . read $ ns -- парсим его
      -- создаем из этого числа синглетон, дальше внутри лямбды
      -- это число будет типом. 
      putStrLn $ withSomeSing n (\n -> useValue n (create n))
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[54]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 25.02.15 18:37
    Оценка: +1
    Здравствуйте, jazzer, Вы писали:

    J>Сорри, ты правда прочитал мой пост
    Автор: jazzer
    Дата: 10.02.15
    ?

    Да, прочитал.
    J>Внимательно? А то ты задаешь вопросы, на которые есть ответы прямо там, причем в примерах кода.
    Возможно, там неявно есть какие-то ответы. Но явно ничего про load_order нету — везде обыгрывается попытка изменения суммы ордера.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[53]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.02.15 05:28
    Оценка:
    J>>Можно вернуть вариант (хм... непереводимая игра слов ), в котором будет зашит статический тип ордера.
    S>Конкретнее?

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

    Что здесь
    Автор: Klapaucius
    Дата: 17.02.15
    , что здесь
    Автор: Evgeny.Panasyuk
    Дата: 22.02.15
    , что здесь
    Автор: jazzer
    Дата: 10.02.15
    и т.п.

    В частности — из-за того самого комбинаторного взрыва типов, о котором говорит
    Автор: jazzer
    Дата: 24.02.15
    jazzer. В частности — из-за того, что нужно иметь пару PhD, чтобы смочь это описать в реальной жизни.

    В итоге так и получается — пока PhD два года пишет внутренне непротиворечивую структуру того же Order'а на типах, в Виллабаджо уже взлетели, продались за 16 миллиардов, вышли на IPO и раз в неделю меняют требования к заказам по требованиям левой задней пятки заказчиков.


    dmitriid.comGitHubLinkedIn
    Re[54]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.02.15 06:21
    Оценка: +2
    Здравствуйте, Mamut, Вы писали:

    M>Что здесь
    Автор: Klapaucius
    Дата: 17.02.15
    , что здесь
    Автор: Evgeny.Panasyuk
    Дата: 22.02.15
    , что здесь
    Автор: jazzer
    Дата: 10.02.15
    и т.п.


    Это сравнительно новый подход (вызванный во многом выходом на арену языков с зависимыми типами и вообще языков с более мощной типизацией и метапрограммированием) — так что в судествующих языках просто-напросто еще нет инфраструктуры (библиотек, макросов, расширений типа LINQ и т.п.).
    В моем варианте ничего сложного нет абсолютно (правда, я к простому варианту реализации пришел совсем не сразу, но то, что есть, меня устраивает).

    M>В частности — из-за того самого комбинаторного взрыва типов, о котором говорит
    Автор: jazzer
    Дата: 24.02.15
    jazzer.


    Комбинаторный взрыв будет, только если мы захотим описать скопом все возможные состояния всех возможных свойств и запихнуть это дело в вариант. И только. Если использовать это как у меня (т.е. проерять те свойства, которые нас интересуют) — никакого взрыва не будет.

    M>В частности — из-за того, что нужно иметь пару PhD, чтобы смочь это описать в реальной жизни.


    Сорри, где ты видишь у меня что-то, для чего требуется пара PhD?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[55]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.02.15 06:23
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>Сорри, ты правда прочитал мой пост
    Автор: jazzer
    Дата: 10.02.15
    ?

    S>Да, прочитал.
    J>>Внимательно? А то ты задаешь вопросы, на которые есть ответы прямо там, причем в примерах кода.
    S>Возможно, там неявно есть какие-то ответы. Но явно ничего про load_order нету — везде обыгрывается попытка изменения суммы ордера.

    Я ответил рядом. Если очень нужно, напишу примеры кода, но, имхо, и так все понятно.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[56]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 26.02.15 08:48
    Оценка: +1
    Здравствуйте, jazzer, Вы писали:
    J>Я ответил рядом. Если очень нужно, напишу примеры кода, но, имхо, и так все понятно.
    Я пока увидел много рассуждений о том, как и что синтаксически развести. Есть риск того, что мне "и так всё понятно" неверно.
    Давайте приведём хотя бы один пример тела функции load_order. Сигнатуры — это здорово, но писать-то надо не только их.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[57]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.02.15 09:07
    Оценка: -1 :)
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:

    J>>Я ответил рядом. Если очень нужно, напишу примеры кода, но, имхо, и так все понятно.
    S>Я пока увидел много рассуждений о том, как и что синтаксически развести. Есть риск того, что мне "и так всё понятно" неверно.
    S>Давайте приведём хотя бы один пример тела функции load_order. Сигнатуры — это здорово, но писать-то надо не только их.

    да нету никакого кода в load_order, самый обычный код, возвращающий самый обычный order безо всяких свойств.
    Все интересное начинается потом, когда ты собираешься что-то с ордером делать — а функции, которые ты собираешься звать, требуют те или иные установленные свойства.

    Чтоб не писать еще раз, цитирую (судя по всему, ты этот ответ просто не читал):

    J>>А можно вернуть "просто ордер", как в моем примере по ссылке — но ты с ним ничего реального не сможешь сделать. Вернее, сможешь, но только после проверки необходимых свойств — и попытки вызвать код для ордера, у которого необходимые свойства не проверены, просто не скомпилируются.
    S>Пока непонятно. Получается, мы не можем персисить ордер за пределы текущего процесса — а это очень плохо, т.к. типичные workflow ордеров катастрофически медленные. Требование держать всё в памяти — невыполнимо.

    Посмотри на мой код

    по ссылке все же (я понимаю, что лень, но все-таки). Там есть свойства, которые сидят прямо в ордере, и замечательно "персистятся".
    Так что сделал check_fraud, записал результат order.fraud_checked=true, order.fraud_check_result=true, заперсистил. У тебя уже новый тип, как после долгой проверки, так и после загрузки "заперсисченного" ордера из БД, непосредственно из order.fraud_check_result.

    Как именно проверяются свойства — см. PROP_IF в моем большом посте. И пример (там же) тела функции try_to_change_amount, которая пытается вызвать функцию increase_amount, но та требует наличия свойств HasRisk:false и Shipped:false и не дает себя звать без предварительной проверки оных.
    Если что-то непонятно — спрашивай.


    ЗЫ Серьезно, складывается впечатление, что ты читаешь мои ответы через раз и по диагонали. Очень неприятно.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[58]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.02.15 09:29
    Оценка:
    J>да нету никакого кода в load_order, самый обычный код, возвращающий самый обычный order безо всяких свойств.
    J>Все интересное начинается потом, когда ты собираешься что-то с ордером делать — а функции, которые ты собираешься звать, требуют те или иные установленные свойства.

    Я же говорю: теоретики.

    Заказ в базе лежит в одном из нцати состояний (то есть имеет нцать свойств). Если его возвращать из load_order «безо всяких свойств», то откуда эти свойства возмутся, когда внезапно требуются «те или иные свойства»?


    dmitriid.comGitHubLinkedIn
    Re[59]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.02.15 09:37
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    J>>да нету никакого кода в load_order, самый обычный код, возвращающий самый обычный order безо всяких свойств.

    J>>Все интересное начинается потом, когда ты собираешься что-то с ордером делать — а функции, которые ты собираешься звать, требуют те или иные установленные свойства.

    M>Я же говорю: теоретики.


    M>Заказ в базе лежит в одном из нцати состояний (то есть имеет нцать свойств). Если его возвращать из load_order «безо всяких свойств», то откуда эти свойства возмутся, когда внезапно требуются «те или иные свойства»?


    Вот ты бы сначала задал вопросы, получил ответы, а потом уже раздавал бы оценки

    Откуда свойства берутся, показано в моей статье на примере increase_amount и try_to_change_amount (ты-то ее прочитал, даже оценку поставил же).
    Считай, что Order в статье был извлечен из БД как есть.

    Если есть вопросы — задавай, а не зубоскаль.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[60]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.02.15 10:04
    Оценка:
    J>Вот ты бы сначала задал вопросы, получил ответы, а потом уже раздавал бы оценки

    Я задавал множество вопросов. Ответы если и получал, то неполные и после множество долгих рассказов и сказок.

    J>Откуда свойства берутся, показано в моей статье на примере increase_amount и try_to_change_amount (ты-то ее прочитал, даже оценку поставил же).


    Оценку я поставил, потому что да — наконец-то появился нормальный внятный и полноценный ответ на мои простейшие вопросы. И да, подход показался интересным.

    J>Считай, что Order в статье был извлечен из БД как есть.

    J>Если есть вопросы — задавай, а не зубоскаль.

    Вон — Sinclair задает внятные вопросы. Твою реакцию на них тебе процитировать, или сам найдешь?


    dmitriid.comGitHubLinkedIn
    Re[61]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.02.15 10:23
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>Вот ты бы сначала задал вопросы, получил ответы, а потом уже раздавал бы оценки


    M>Я задавал множество вопросов. Ответы если и получал, то неполные и после множество долгих рассказов и сказок.


    Никаких сказок, я всю дорогу описывал подход, который в результате детально описал в статье.

    J>>Откуда свойства берутся, показано в моей статье на примере increase_amount и try_to_change_amount (ты-то ее прочитал, даже оценку поставил же).


    M>Оценку я поставил, потому что да — наконец-то появился нормальный внятный и полноценный ответ на мои простейшие вопросы. И да, подход показался интересным.


    Тогда непонятно твое ёрничанье. В моем подходе есть ответы и на твои вопросы, и на вопросы Синклера. Я их уже несколько раз разъяснил. Если что-то непонятно — задай конкретные вопросы.

    J>>Считай, что Order в статье был извлечен из БД как есть.

    J>>Если есть вопросы — задавай, а не зубоскаль.

    M>Вон — Sinclair задает внятные вопросы. Твою реакцию на них тебе процитировать, или сам найдешь?


    И что конкретно тебе непонятно в моих ответах ему? Мою реакцию на его посты оставь между нами, плиз, я ее вполне внятно объяснил.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[58]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 26.02.15 14:20
    Оценка: 72 (2) +2
    Здравствуйте, jazzer, Вы писали:

    J>да нету никакого кода в load_order, самый обычный код, возвращающий самый обычный order безо всяких свойств.

    J>Все интересное начинается потом, когда ты собираешься что-то с ордером делать — а функции, которые ты собираешься звать, требуют те или иные установленные свойства.
    И, простите, чем это отличается от нашего нынешнего кода, где изо всех типов есть только самый обычный ордер, безо всяких "свойств"?

    У меня весь workflow состоит из вот таких шагов:
    — поднять ордер из базы
    — попытаться двинуться на шаг вперёд
    — сохранить ордер в базу (не нужно, если transition failed).

    J>Как именно проверяются свойства — см. PROP_IF в моем большом посте. И пример (там же) тела функции try_to_change_amount, которая пытается вызвать функцию increase_amount, но та требует наличия свойств HasRisk:false и Shipped:false и не дает себя звать без предварительной проверки оных.


    J>Если что-то непонятно — спрашивай.

    Непонятно, в чём бенефит статической типизации. Я могу описать функцию increase_amount вот так:
    public void Order increase_amount(Order order, Money newAmount)
    {
      Contracts.Assert(order, (o)=> !o.HasRisk); // выбросим исключение!
      Contracts.Assert(order, (o)=> !o.Shipped); // выбросим исключение!
    
      Contracts.Assert(order, (o)=> newAmount <= 1.20 * o.CurrentAmount) // выбросим исключение!
    
      return order.Clone().SetAmount(newAmount);
    }

    А могу — вот так:
    public void Order<Risk.None, Shipped.None> increase_amount(Order<Risk.None, Shipped.None> order, Money newAmount)
    {
      Contracts.Assert(order, (o)=> newAmount <= 1.20 * o.CurrentAmount) // выбросим исключение!
      return order.Clone().SetAmount(newAmount);
    }


    Вся разница — в том, что теперь в try_increase_amount мне придётся провести корректное приведение типов:
    public void Order try_increase_amount(Order order, Money newAmount)
    {
      var o = checkNoRisk(order); // выбросим исключение, если есть риск, вернём Order<Risk.None, S> иначе
      var o2 = checkNotShipped(o); // выбросим исключение, если зашиплен, вернём Order<Risk.None, Shipped.None> иначе
    
      return increase_amount(order // не компилируется
                             o // не компилируется
                             o2, newAmount); // ура, компилируется!!!
    }

    Но мы наблюдаем те же яйца, вид сбоку. Всё, try_increase_amount — это наш верхний уровень, мы не можем ничего доказать за её пределами.
    У нас совершенно нормально иметь workflow, в котором мы пытаемся увеличить amount у уже отправленного ордера. Потому что компилятор видит ровно один шаг этого workflow.
    В итоге, мы написали кучу кода, напрягли компилятор, но никак не улучшили поведение системы. У нас уже и так increase_amount была вполне локальна — все бизнес-правила выписаны в начале, шансы напортачить в них минимальны. Ну вынесли мы требования к флагам из тела в сигнатуру — так ведь нам это никак не помогло!



    J>ЗЫ Серьезно, складывается впечатление, что ты читаешь мои ответы через раз и по диагонали. Очень неприятно.

    А у меня наоборот — складывается впечатление, что ты отвечаешь не на те вопросы, которые я задаю.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[59]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 26.02.15 14:43
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    J>>да нету никакого кода в load_order, самый обычный код, возвращающий самый обычный order безо всяких свойств.

    J>>Все интересное начинается потом, когда ты собираешься что-то с ордером делать — а функции, которые ты собираешься звать, требуют те или иные установленные свойства.
    S>И, простите, чем это отличается от нашего нынешнего кода, где изо всех типов есть только самый обычный ордер, безо всяких "свойств"?

    Тем что теперь компилятор будет заставлять пользователя проверять свойства. И соответственно он не сможет проигнорировать тот факт, что тут две логические ветки (свойство верно или неверно), и не сможет порушить предусловия вызываемой функции.

    S>Непонятно, в чём бенефит статической типизации. Я могу описать функцию increase_amount вот так:

    S>
    S>public void Order increase_amount(Order order, Money newAmount)
    S>{
    S>  Contracts.Assert(order, (o)=> !o.HasRisk); // выбросим исключение!
    S>  Contracts.Assert(order, (o)=> !o.Shipped); // выбросим исключение!
    S>  Contracts.Assert(order, (o)=> newAmount <= 1.20 * o.CurrentAmount) // выбросим исключение!
    S>  return order.Clone().SetAmount(newAmount);
    S>}
    S>


    Что проверяют твои Assert'ы — нарушение предусловия или вполне легальный вариант данных? Это важно.
    Обычно assert означает нарушение предусловия, и лучшей реакцией будет склейка ласт ASAP — так как программа попала в неизвестное состояние, непонятно каким способом.

    EP>Нарушение предусловия это баг в программе, программа находится в том состоянии в котором не должна была по логике вещей, и как она туда попала неизвестно, лучше всего пристрелить такую программу как взбесившуюся собаку. Почитай наконец что такое precondition.
    EP>Предусловия можно проверять, и как-то энфорсить, но отнюдь не обязательно. Например assert'ы энфорсящие предусловия часто используют только в отладочных режимах.
    EP>Система типов позволяет энфорсить некоторые предусловия в compile-time, но не все. Я даже больше скажу, далеко не все предусловия можно проверить в runtime — попытка такой проверки попросту может поломать инварианты, и сделать невозможным достижение постусловий.


    S>Вся разница — в том, что теперь в try_increase_amount мне придётся провести корректное приведение типов:

    S>
    ...
    S>  var o = checkNoRisk(order); // выбросим исключение, если есть риск, вернём Order<Risk.None, S> иначе
    S>  var o2 = checkNotShipped(o); // выбросим исключение, если зашиплен, вернём Order<Risk.None, Shipped.None> иначе
    S>...


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

    S>Но мы наблюдаем те же яйца, вид сбоку. Всё, try_increase_amount — это наш верхний уровень, мы не можем ничего доказать за её пределами.

    S>У нас совершенно нормально иметь workflow, в котором мы пытаемся увеличить amount у уже отправленного ордера. Потому что компилятор видит ровно один шаг этого workflow.
    S>В итоге, мы написали кучу кода, напрягли компилятор, но никак не улучшили поведение системы. У нас уже и так increase_amount была вполне локальна — все бизнес-правила выписаны в начале, шансы напортачить в них минимальны. Ну вынесли мы требования к флагам из тела в сигнатуру — так ведь нам это никак не помогло!

    Для задачи Mamut'а
    Автор: Mamut
    Дата: 05.02.15
    это действительно не имеет смысла. Я уже многократно об этом говорил:

    EP>Если же для запуска функции нет необходимости делать проверки, change_amount сама всё что нужно проверяет внутри, и более того её запуск с невыполненными условиями не является ошибкой, а вполне штатным режимом — то пытаться переписать все эти внутренние проверки на типы, не вижу смысла, это никак не отразится на местах вызова этой функции.

    Отредактировано 26.02.2015 14:44 Evgeny.Panasyuk . Предыдущая версия .
    Re[60]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.02.15 14:58
    Оценка:
    EP>Для задачи Mamut'а
    Автор: Mamut
    Дата: 05.02.15
    это действительно не имеет смысла. Я уже многократно об этом говорил:

    EP>

    EP>>Если же для запуска функции нет необходимости делать проверки, change_amount сама всё что нужно проверяет внутри, и более того её запуск с невыполненными условиями не является ошибкой, а вполне штатным режимом — то пытаться переписать все эти внутренние проверки на типы, не вижу смысла, это никак не отразится на местах вызова этой функции.



    Я про это тоже говорил. Ты придумал себе какие-то предусловия и активно пытаешься это энфорсить. В моем случае условия никуда не исчезли — это все те же условия. Только ВНЕЗАПНО для них «не имеет смысла»

    Вообще, экстраполируя твое заявление, получается, что хваленые типы вообще не имеют смысла почти никогда. Ведь если программисты вменяемые, то будет банальный вызов функции, в который передастся бизнес-объект, над которым будут произведены какие-то действия, а обратно вернется уже измененный объект.

    В итоге получается что?

    
    Order = load_order(Id),
    UpdatedOrder = process_order(Order).  
      %% внутри process_order «это действительно не имеет смысла» ©
    
    ....
    
    %% в другом месте
    
    Order = load_order(Id),
    UpdatedOrder = increase_order_amount(Order, Amount).
      %% внутри increase_order_amount «это действительно не имеет смысла» ©
    
    
    %% в третьем месте
    
    Order = load_order(Id),
    UpdatedOrder = archive_order(Order).
      %% внутри archive_order «это действительно не имеет смысла» ©
    
    %% и т.п.


    Где «это» тогда имеет смысл? То, что в process_order/increase_order_amount/archive_order мы передаем именно Order, а не GoodsItem? Ну это у нас и так отлавливают интеграционные тесты, и таких случаев возникает хорошо если два в год.



    dmitriid.comGitHubLinkedIn
    Re[61]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 26.02.15 15:16
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Я про это тоже говорил. Ты придумал себе какие-то предусловия и активно пытаешься это энфорсить. В моем случае условия никуда не исчезли — это все те же условия. Только ВНЕЗАПНО для них «не имеет смысла»


    Повторюсь:

    EP>Состояние ранее являвшееся ошибкой, стало вполне штатным режимом работы, и это повлияло на возможные варианты реализации этого в коде. И что тебя удивляет?


    M>Вообще, экстраполируя твое заявление, получается, что хваленые типы вообще не имеют смысла почти никогда.


    Что за мода такая пошла на экстраполяцию из каких-то частных случаев?

    M>Ведь если программисты вменяемые, то будет банальный вызов функции, в который передастся бизнес-объект, над которым будут произведены какие-то действия, а обратно вернется уже измененный объект.


    То есть предусловий нет? О чём и речь

    M>Где «это» тогда имеет смысл?


    Для тех задач где есть какие-то предусловия.
    Re[59]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.02.15 15:40
    Оценка: +2
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>да нету никакого кода в load_order, самый обычный код, возвращающий самый обычный order безо всяких свойств.

    J>>Все интересное начинается потом, когда ты собираешься что-то с ордером делать — а функции, которые ты собираешься звать, требуют те или иные установленные свойства.
    S>И, простите, чем это отличается от нашего нынешнего кода, где изо всех типов есть только самый обычный ордер, безо всяких "свойств"?

    Отличается тем, что проверки допустимых операций (вызов недопустимой операции — ошибка программиста) происходят во время компиляции.
    Таким образом, недопустимый код просто не компилируется и в продакшен не попадает физически.

    S>Непонятно, в чём бенефит статической типизации. Я могу описать функцию increase_amount вот так:

    S>
    // выбросим исключение!


    А у тебя проверки допустимых операций (вызов недопустимой операции — ошибка программиста) происходят во время выполнения (в продакшене, да).

    Твой аргумент, по сути — нафига нам статическая типизация, если мы можем устроить динамическую и бросаться исключениями в случае ошибки программиста?
    И ничего, что исключения имеют обыкновение вылетать в продакшене в момент обработки сделаки на миллион.

    S>В итоге, мы написали кучу кода, напрягли компилятор, но никак не улучшили поведение системы.


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

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

    Твой же подход не исключает ошибки, а наоборот, провоцирует: "Пишите, что хотите! Если напишете фигню — вылетит исключение!"
    А юзеру покажем баннер: "Извините, у нас тут произошло исключение, похоже, программер накосячил и позвал не ту функцию, мы его высечем, баг пофиксим, зарелизим, через недельку приходите и попробуйте снова".

    S>У нас уже и так increase_amount была вполне локальна — все бизнес-правила выписаны в начале, шансы напортачить в них минимальны. Ну вынесли мы требования к флагам из тела в сигнатуру — так ведь нам это никак не помогло!


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

    J>>ЗЫ Серьезно, складывается впечатление, что ты читаешь мои ответы через раз и по диагонали. Очень неприятно.

    S>А у меня наоборот — складывается впечатление, что ты отвечаешь не на те вопросы, которые я задаю.

    Ну вот сейчас ты задал нормальный вопрос. Правда, он о том, зачем вообще нужна статическая типизация, если можно все проверять в динамике и бросаться исключениями, но тем не менее это нормальный вопрос.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[62]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.02.15 16:11
    Оценка:
    M>>Вообще, экстраполируя твое заявление, получается, что хваленые типы вообще не имеют смысла почти никогда.
    EP>Что за мода такая пошла на экстраполяцию из каких-то частных случаев?

    Какие к черту частные случаи? Ты говоришь про общий случай уже ниже:

    EP>То есть предусловий нет? О чём и речь


    M>>Где «это» тогда имеет смысл?

    EP>Для тех задач где есть какие-то предусловия.

    Чем это принципиально отличается от одной точки входа, после которой идут условия? Простейший вопрос:

    Было: copy-paste кода в 5 мест в виде if(X)->if(Y)->if(Z)->вызов_функции(). Раскорячились, написали «предусловия» на типах

    Стало: перенесли if(X)->if(Y)->if(Z) в саму функцию. Теперь в пяти местах стоит только вызов_функции(). Все, «это действительно не имеет смысла»© и «То есть предусловий нет? О чём и речь»© ?



    Я вот этого момента не понимаю.


    dmitriid.comGitHubLinkedIn
    Re[63]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 26.02.15 16:38
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>Чем это принципиально отличается от одной точки входа, после которой идут условия? Простейший вопрос:


    M>Было: copy-paste кода в 5 мест в виде if(X)->if(Y)->if(Z)->вызов_функции(). Раскорячились, написали «предусловия» на типах


    M>Стало: перенесли if(X)->if(Y)->if(Z) в саму функцию. Теперь в пяти местах стоит только вызов_функции(). Все, «это действительно не имеет смысла»© и «То есть предусловий нет? О чём и речь»© ?


    Между ифами может быть много кода, причем в разных местах — разного. Не всегда возможно перенести ифы в одну функцию.
    То есть проверки условий могут быть разбросаны по разным местам системы. К примеру, проверили где-то наверху, что переменная не равна нулю, и дальше с помощью типов это знание растекается по всем функциям.
    Re[63]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 26.02.15 16:53
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>>>Вообще, экстраполируя твое заявление, получается, что хваленые типы вообще не имеют смысла почти никогда.

    EP>>Что за мода такая пошла на экстраполяцию из каких-то частных случаев?
    M>Какие к черту частные случаи? Ты говоришь про общий случай уже ниже:

    Частный случай это твоя конкретная постановка задачи.

    EP>>Для тех задач где есть какие-то предусловия.

    M>Чем это принципиально отличается от одной точки входа, после которой идут условия? Простейший вопрос:
    M>Было: copy-paste кода в 5 мест в виде if(X)->if(Y)->if(Z)->вызов_функции(). Раскорячились, написали «предусловия» на типах
    M>Стало: перенесли if(X)->if(Y)->if(Z) в саму функцию. Теперь в пяти местах стоит только вызов_функции(). Все, «это действительно не имеет смысла»© и «То есть предусловий нет? О чём и речь»© ?

    Как во втором варианте функция реагирует на !X || !Y || !Z?
    Re[64]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.02.15 18:17
    Оценка: :)
    M>>Чем это принципиально отличается от одной точки входа, после которой идут условия? Простейший вопрос:
    M>>Было: copy-paste кода в 5 мест в виде if(X)->if(Y)->if(Z)->вызов_функции(). Раскорячились, написали «предусловия» на типах
    M>>Стало: перенесли if(X)->if(Y)->if(Z) в саму функцию. Теперь в пяти местах стоит только вызов_функции(). Все, «это действительно не имеет смысла»© и «То есть предусловий нет? О чём и речь»© ?

    EP>Как во втором варианте функция реагирует на !X || !Y || !Z?


    Как это отвечает на мой вопрос? Никак.


    dmitriid.comGitHubLinkedIn
    Re[64]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.02.15 18:19
    Оценка:
    M>>Чем это принципиально отличается от одной точки входа, после которой идут условия? Простейший вопрос:

    M>>Было: copy-paste кода в 5 мест в виде if(X)->if(Y)->if(Z)->вызов_функции(). Раскорячились, написали «предусловия» на типах


    M>>Стало: перенесли if(X)->if(Y)->if(Z) в саму функцию. Теперь в пяти местах стоит только вызов_функции(). Все, «это действительно не имеет смысла»© и «То есть предусловий нет? О чём и речь»© ?


    ARK>Между ифами может быть много кода, причем в разных местах — разного. Не всегда возможно перенести ифы в одну функцию.

    ARK>То есть проверки условий могут быть разбросаны по разным местам системы. К примеру, проверили где-то наверху, что переменная не равна нулю, и дальше с помощью типов это знание растекается по всем функциям.


    Блин. Чем дальше, тем любопытсвеннее © Чем дальше, тем более идиотские странные условия должны выполниться, чтобы мы наконец-то увидели всю мощь и красоту типов

    Отредактировано: И да, введение условия про «где-то там if-ы и прочая» не отменяет моего вопроса, от слова вообще. Даже в моей задаче «может быть много кода между if-ами» и т.п.


    dmitriid.comGitHubLinkedIn
    Отредактировано 26.02.2015 18:20 Mamut [ищите в других сетях] . Предыдущая версия .
    Re[65]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 26.02.15 20:30
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    ARK>>Между ифами может быть много кода, причем в разных местах — разного. Не всегда возможно перенести ифы в одну функцию.

    ARK>>То есть проверки условий могут быть разбросаны по разным местам системы. К примеру, проверили где-то наверху, что переменная не равна нулю, и дальше с помощью типов это знание растекается по всем функциям.

    M>Отредактировано: И да, введение условия про «где-то там if-ы и прочая» не отменяет моего вопроса, от слова вообще. Даже в моей задаче «может быть много кода между if-ами» и т.п.


    Ну... не знаю, как еще объяснить. На мой взгляд, принципиальное различие очевидно — в случае с типами программист может возложить на компилятор дополнительные проверки, в случае без типов — такие проверки делаются тестами. О чем тут еще спорить... Нужны ли дополнительные проверки с помощью типизации? Всегда ли они нужны? Сложно их писать или просто? Где человек скорее ошибется — в описании типа или в коде теста? Все это бессмысленно обсуждать в отрыве от предметной области, цены ошибки, квалификации программиста, качества доступных инструментов разработки и т.п. Если брать сферического коня в вакууме, то лично мое мнение — чем больше можно проверить на этапе компиляции, тем лучше.
    Re[66]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.02.15 21:05
    Оценка:
    M>>Отредактировано: И да, введение условия про «где-то там if-ы и прочая» не отменяет моего вопроса, от слова вообще. Даже в моей задаче «может быть много кода между if-ами» и т.п.

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


    Хороша песня, начинай сначала


    Вот есть код, пусть даже гипотетический. Есть вопрос по коду и/или работе с кодом. Мне в ответ говорят «нет, тут бессмысленно это». Спрашиваю, «в чем бессмысленность? в чем принципиальное различие от ситуации X?». «принципиальное различие очевидно — в случае с типами программист может возложить на компилятор дополнительные проверки». И так — по кругу.

    ARK>Если брать сферического коня в вакууме, то лично мое мнение — чем больше можно проверить на этапе компиляции, тем лучше.


    Выделенное — это ключевое во всех этих спорах. О чем я рядом уже говорил
    Автор: Mamut
    Дата: 26.02.15
    .


    dmitriid.comGitHubLinkedIn
    Re[60]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 26.02.15 21:33
    Оценка: +1
    Здравствуйте, jazzer, Вы писали:


    J>Отличается тем, что проверки допустимых операций (вызов недопустимой операции — ошибка программиста) происходят во время компиляции.

    Ну конечно же нет.
    J>Таким образом, недопустимый код просто не компилируется и в продакшен не попадает физически.
    J>А у тебя проверки допустимых операций (вызов недопустимой операции — ошибка программиста) происходят во время выполнения (в продакшене, да).
    Простите, но у вас — тоже. Вот у вас при загрузке ордера для изменения amount оказалось, что флаг hasRisk установлен.
    Что произойдёт в вашем коде?

    J>А типы, вообще-то, не о том, чтоб улучшить поведение системы.

    J>Корректно работающая система будет работать корректно независимо от того, написана она на на статической типизации или на рукопашном ассемблере по живой памяти.
    J>Они о том, чтоб исключить ошибки при ее написании.
    Это всё понятно. Осталось воплотить хоть что-то из громких лозунгов в жизнь.

    J>А юзеру покажем баннер: "Извините, у нас тут произошло исключение, похоже, программер накосячил и позвал не ту функцию, мы его высечем, баг пофиксим, зарелизим, через недельку приходите и попробуйте снова".

    А вы что покажете юзеру? Ну вот у вас там после загрузки из базы "обычного Order, безо всяких свойств" проверили наличие флагов — оказазось, упс, отправлен уже этот ордер. Что делать?

    J>Помогло, так как теперь компилятор следит, чтоб ты не вызвал то, что нельзя. А не ждал исключения в продакшене.

    А по-моему мы просто удвоили количество строк кода, которые по-прежнему выбрасывают исключение.
    J>>>ЗЫ Серьезно, складывается впечатление, что ты читаешь мои ответы через раз и по диагонали. Очень неприятно.
    S>>А у меня наоборот — складывается впечатление, что ты отвечаешь не на те вопросы, которые я задаю.

    J>он о том, зачем вообще нужна статическая типизация.

    Нет. Вопрос как раз в этом — что вместо исключений предлагает нам статическая типизация. Пока что ответа как не было, так и нету.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[65]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 26.02.15 21:42
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Блин. Чем дальше, тем любопытсвеннее © Чем дальше, тем более идиотские странные условия должны выполниться, чтобы мы наконец-то увидели всю мощь и красоту типов

    Не, я нутром чую, что должен быть какой-то способ получить бенефиты. Но нащупать этот способ я пока до конца не могу.
    В том смысле, что ведь и так в ассемблере никаких типов нету — тем не менее, компилятор таки следит за тем, чтобы "обращение к ячейкам памяти" не реинтерпретировало флоат как интегер.
    Значит, по идее, можно родить какой-то такой язык описания workflow ордеров, при котором нам компилятор (или верификатор) статически скажет "у вас есть незаконный переход, сделайте с этим что-нибудь". И, грубо говоря, мы будем вынуждены в список отображения ордеров для модификации добавить фильтр вроде isShipped == false, или навесить валидатор на поле ввода размера пени, или ещё что там положено делать. Потому что если в контракте бизнес-операции сказано "не более 5%", то обеспечивать это надо предварительными проверками там, где они уместны. Т.е. ты должен будешь компилятору доказать, что у тебя все варианты покрыты.
    А то, что в процессе этого workflow между отдельными шагами ордера персистятся в базу, или что между GUI и бэк-ендом ездит нетипизированный JSON, должно влиять не более, чем то, что в память пишутся нетипизированные байты (а в некоторых средах они ещё и читаться могут совсем другим процессом — и всё равно type safety на месте).

    Должно, но вот как именно — я пока не вкуриваю
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[61]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 27.02.15 01:05
    Оценка: +1
    Здравствуйте, Sinclair, Вы писали:

    J>>Отличается тем, что проверки допустимых операций (вызов недопустимой операции — ошибка программиста) происходят во время компиляции.

    S>Ну конечно же нет.

    Ну конечно же да.

    Компилятор в типизированных языках занимается ровно этим — не дает вызывать недопустимые операции. Как ты там сказал: "компилятор таки следит за тем, чтобы "обращение к ячейкам памяти" не реинтерпретировало флоат как интегер". Так вот он следит ровно потому, что есть типы флоат и интегер, и он проверяет соответствие операций типам и дает по рукам, если операция несовместима с типом. А если ячейка памяти никаким типом не помечена, то компилятор, очевидно, не сможет проверить ровно ничего. В асме ты говоришь: загрузи данные из этого адреса в целочисленный регистр, а из того — в плавучий. И компилятор асма все это делает, как ты написал, и ничего проверить не может: адрес — это просто набор цифр. Ты можешь тупо поменять адреса местами, и компилятор не почешется — для него все адреса на одно лицо, если нет типов.

    J>>Таким образом, недопустимый код просто не компилируется и в продакшен не попадает физически.

    J>>А у тебя проверки допустимых операций (вызов недопустимой операции — ошибка программиста) происходят во время выполнения (в продакшене, да).
    S>Простите, но у вас — тоже. Вот у вас при загрузке ордера для изменения amount оказалось, что флаг hasRisk установлен.
    S>Что произойдёт в вашем коде?

    В моем коде для него будет невозможно вызвать increase_amount.
    В твоем — возможно все, потому что все отдано на откуп исключениям.

    J>>А типы, вообще-то, не о том, чтоб улучшить поведение системы.

    J>>Корректно работающая система будет работать корректно независимо от того, написана она на на статической типизации или на рукопашном ассемблере по живой памяти.
    J>>Они о том, чтоб исключить ошибки при ее написании.
    S>Это всё понятно. Осталось воплотить хоть что-то из громких лозунгов в жизнь.

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

    S>А вы что покажете юзеру? Ну вот у вас там после загрузки из базы "обычного Order, безо всяких свойств" проверили наличие флагов — оказазось, упс, отправлен уже этот ордер. Что делать?


    Покажем "Мы тут проверили ордер, он уже отправлен".
    А в твоем случае "Мы тут проверили ордер, он уже отправлен, но #$%#$-программер все равно с какого-то бодуна позвал increase_amount, сорри, мы его обязательно высечем".

    J>>он о том, зачем вообще нужна статическая типизация.

    S>Нет. Вопрос как раз в этом — что вместо исключений предлагает нам статическая типизация. Пока что ответа как не было, так и нету.

    Не передергивай. Статическая типизация предлагается не вместо исключений вообще, а вместо исключений, отлавливающих ошибки программиста. "Нормальные" исключения (типа "файл с указанным именем не найден") никуда не делись и их никто менять на статическую типизацию не предлагает.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[66]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 27.02.15 01:18
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>В том смысле, что ведь и так в ассемблере никаких типов нету — тем не менее, компилятор таки следит за тем, чтобы "обращение к ячейкам памяти" не реинтерпретировало флоат как интегер.


    жжешь

    S>Значит, по идее, можно родить какой-то такой язык описания workflow ордеров, при котором нам компилятор (или верификатор) статически скажет "у вас есть незаконный переход, сделайте с этим что-нибудь". И, грубо говоря, мы будем вынуждены в список отображения ордеров для модификации добавить фильтр вроде isShipped == false, или навесить валидатор на поле ввода размера пени, или ещё что там положено делать. Потому что если в контракте бизнес-операции сказано "не более 5%", то обеспечивать это надо предварительными проверками там, где они уместны. Т.е. ты должен будешь компилятору доказать, что у тебя все варианты покрыты.


    Именно так. Именно об этом я и пишу всю дорогу. Код, содержащий незаконный переход, просто не скомпилируется.

    S>А то, что в процессе этого workflow между отдельными шагами ордера персистятся в базу, или что между GUI и бэк-ендом ездит нетипизированный JSON, должно влиять не более, чем то, что в память пишутся нетипизированные байты (а в некоторых средах они ещё и читаться могут совсем другим процессом — и всё равно type safety на месте).


    S>Должно, но вот как именно — я пока не вкуриваю


    Я же показал на примере. Вот мы в одном месте провели долгую проверку риска для ордера, по результатам взвели соответствуюший флажок в ордере, что проверка проведена и результат такой-то, заперсистили ордер в БД (в нетипизированный JSON, если угодно).
    На следующий день (или на другом хосте, если это JSON по сети) мы достаем ордер (уже с обновленным флажком) из БД и ограничиваемся просто проверкой этого флажка, чтобы определить типизированное свойство HasRisk — и только после такой проверки компилятор разрешит тебе позвать функцию, статически требующую HasRisk.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[62]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 05:36
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Ну конечно же да.

    Пруф? Код — в студию. Бла-бла — не надо, я его сам прекрасно могу написать.
    S>>Простите, но у вас — тоже. Вот у вас при загрузке ордера для изменения amount оказалось, что флаг hasRisk установлен.
    S>>Что произойдёт в вашем коде?
    J>В моем коде для него будет невозможно вызвать increase_amount.
    Ну и что? increase_amount вызывается ровно в одном месте — я показал вам код.
    J>В твоем — возможно все, потому что все отдано на откуп исключениям.
    Мало ли что "возможно". Я-то говорю о том, что есть.


    J>Покажем "Мы тут проверили ордер, он уже отправлен".

    J>А в твоем случае "Мы тут проверили ордер, он уже отправлен, но #$%#$-программер все равно с какого-то бодуна позвал increase_amount, сорри, мы его обязательно высечем".
    Откуда такие фантазии? В обоих случаях показываем один и тот же текст, вылетает одно и то же исключение. Т.е., что и требовалось доказать — вы написали в два раза больше кода (не считая бойлерплейта на поддержку типов — только прикладной код), чтобы получить систему с тем же поведением, что и раньше. И ровно с той же надёжностью.

    J>Не передергивай. Статическая типизация предлагается не вместо исключений вообще, а вместо исключений, отлавливающих ошибки программиста. "Нормальные" исключения (типа "файл с указанным именем не найден") никуда не делись и их никто менять на статическую типизацию не предлагает.

    Мы говорим не про исключения вообще, а про конкретную задачу процессинга ордеров.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[67]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 05:39
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Именно так. Именно об этом я и пишу всю дорогу. Код, содержащий незаконный переход, просто не скомпилируется.

    Осталось показать практический пример.


    J>Я же показал на примере. Вот мы в одном месте провели долгую проверку риска для ордера, по результатам взвели соответствуюший флажок в ордере, что проверка проведена и результат такой-то, заперсистили ордер в БД (в нетипизированный JSON, если угодно).

    J>На следующий день (или на другом хосте, если это JSON по сети) мы достаем ордер (уже с обновленным флажком) из БД и ограничиваемся просто проверкой этого флажка, чтобы определить типизированное свойство HasRisk — и только после такой проверки компилятор разрешит тебе позвать функцию, статически требующую HasRisk.
    Да ничего вы не показали!!!!! Вы всего лишь перенесли проверку изнутри функции наружу — а программа как падала, так и продолжает падать.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[67]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 07:02
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>Вот есть код, пусть даже гипотетический. Есть вопрос по коду и/или работе с кодом. Мне в ответ говорят «нет, тут бессмысленно это». Спрашиваю, «в чем бессмысленность? в чем принципиальное различие от ситуации X?». «принципиальное различие очевидно — в случае с типами программист может возложить на компилятор дополнительные проверки». И так — по кругу.


    Без типов:
    int BadIncrease(object number)
    {
      return ((int)number + 1);
    }
    
    Console.WriteLine(BadIncrease(33));  // выводит 33
    Console.WriteLine(BadIncrease("qwerty"));  // ошибка в рантайме


    С типами:
    int GoodIncrease(int number)
    {
      return (number + 1);
    }
    
    Console.WriteLine(GoodIncrease(33));  // выводит 33
    Console.WriteLine(GoodIncrease("qwerty"));  // ошибка времени компиляции


    Зачем нам типы, давайте сунем в функцию ИФ и отличий не будет:
    int MamutFunction1(object number)
    {
      if (number is int)
        BadIncrease(number);
    }
    
    Console.WriteLine(MamutFunction1(33));  // выводит 33
    Console.WriteLine(MamutFunction1("qwerty"));  // все ОК, просто значение не печатается


    Но вот беда, в другом месте мы забыли поставить этот ИФ и компилятор нам ничего не сказал:
    void MamutFunction2()
    {
      // ... прорва кода...
    
      object number = RetrieveValueFromConfig();
    
      // ... прорва кода...
    
      BadIncrease(number);  // БУМ
    
      // ... прорва кода...
    }



    Теперь преимущество видно? В случае с GoodIncrease мы физически не можем передать невалидный аргумент. Да, мы можем ошибиться в заголовке или теле функции GoodIncrease, но эта ошибка будет ровно в одном месте.
    Вы скажете: "но это же просто статическая типизация, это совсем другое!". Нет, это абсолютно то же самое.
    Может быть, такой пример будет нагляднее.
    Re[68]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 27.02.15 07:14
    Оценка: +1
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>Именно так. Именно об этом я и пишу всю дорогу. Код, содержащий незаконный переход, просто не скомпилируется.

    S>Осталось показать практический пример.

    Я же показал, чем тебя не устраивает try_to_change_amount?

    J>>Я же показал на примере. Вот мы в одном месте провели долгую проверку риска для ордера, по результатам взвели соответствуюший флажок в ордере, что проверка проведена и результат такой-то, заперсистили ордер в БД (в нетипизированный JSON, если угодно).

    J>>На следующий день (или на другом хосте, если это JSON по сети) мы достаем ордер (уже с обновленным флажком) из БД и ограничиваемся просто проверкой этого флажка, чтобы определить типизированное свойство HasRisk — и только после такой проверки компилятор разрешит тебе позвать функцию, статически требующую HasRisk.
    S>Да ничего вы не показали!!!!! Вы всего лишь перенесли проверку изнутри функции наружу — а программа как падала, так и продолжает падать.

    Где она падает, сорри? У меня такое чувство, что мы говорим о разных вещах.
    И проверку чего? Проверку данных или проверку кода на предмет неправильных вызовов? У тебя и то и другое в общей куче, у меня только первое, потому что второе невозможно.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[63]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 07:21
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    J>>Ну конечно же да.

    S>Пруф? Код — в студию. Бла-бла — не надо, я его сам прекрасно могу написать.
    S>Мало ли что "возможно". Я-то говорю о том, что есть.

    А что в коде jazzer'а непонятно-то? Даже я понял.

    J>>Покажем "Мы тут проверили ордер, он уже отправлен".

    J>>А в твоем случае "Мы тут проверили ордер, он уже отправлен, но #$%#$-программер все равно с какого-то бодуна позвал increase_amount, сорри, мы его обязательно высечем".
    S>Откуда такие фантазии? В обоих случаях показываем один и тот же текст, вылетает одно и то же исключение. Т.е., что и требовалось доказать — вы написали в два раза больше кода (не считая бойлерплейта на поддержку типов — только прикладной код), чтобы получить систему с тем же поведением, что и раньше. И ровно с той же надёжностью.

    Э... какие фантазии? Исключения там не вылетает, проверок в рантайме нет. Поведение и надежность двух вариантов совершенно разные.
    Re[63]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 27.02.15 07:59
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>Ну конечно же да.

    S>Пруф? Код — в студию. Бла-бла — не надо, я его сам прекрасно могу написать.
    S>>>Простите, но у вас — тоже. Вот у вас при загрузке ордера для изменения amount оказалось, что флаг hasRisk установлен.
    S>>>Что произойдёт в вашем коде?
    J>>В моем коде для него будет невозможно вызвать increase_amount.
    S>Ну и что? increase_amount вызывается ровно в одном месте — я показал вам код.

    В твоем случае increase_amount можно вызвать (в смысле, программист может неосторожным/злонамеренным движением вкопипастить вызов) откуда угодно, из любого кода, из любой ветки, для любого ордера в любом состоянии.
    В моем — только в одном месте, только для ордера, которому разрешено поднимать amount. Все остальные места вызовут ошибку компиляции.
    Собственно, ради этого все и делается.
    У тебя ошибка программиста — исключение в рантайме, если не отловилось тестами — ушло в продакшен.
    У меня ошибка программиста — ошибка компиляции, в продакшен уйти не может в принципе.

    J>>В твоем — возможно все, потому что все отдано на откуп исключениям.

    S>Мало ли что "возможно". Я-то говорю о том, что есть.

    Что есть? есть _уже_ корректно работающая система? так ей ничего не надо уже, она уже написана и уже работает, типы ей никак не помогут и не помешают. А вот при внесении изменений типы могу помочь не допустить ошибок при кодировании. Именно потому, что increase_amount можно вызвать только в одном месте.

    J>>Покажем "Мы тут проверили ордер, он уже отправлен".

    J>>А в твоем случае "Мы тут проверили ордер, он уже отправлен, но #$%#$-программер все равно с какого-то бодуна позвал increase_amount, сорри, мы его обязательно высечем".
    S>Откуда такие фантазии? В обоих случаях показываем один и тот же текст, вылетает одно и то же исключение. Т.е., что и требовалось доказать — вы написали в два раза больше кода (не считая бойлерплейта на поддержку типов — только прикладной код), чтобы получить систему с тем же поведением, что и раньше. И ровно с той же надёжностью.

    Надежностью чего?
    Если что — типы не о надежности работы кода (типа код не валится на неправильных данных — потому что это вопросы верификации данных), а о надежности процесса разработки (уменьшения вероятности ошибок кодирования).
    Есть сомнения в том, что программирование с int и float более безопасно в плане ошибок кодирования, чем программирование по нетипизированным адресам?
    Есть сомнения, что программирование с нормальными типами в интерфейсах (f(Class1, Class2)->Class3) более безопасно в плане ошибок кодирования, чем программирование в терминах общего класса Object (f(Object, Object)->Object)?
    Если нет (ведь нет же, я надеюсь?), то почему есть тут?

    J>>Не передергивай. Статическая типизация предлагается не вместо исключений вообще, а вместо исключений, отлавливающих ошибки программиста. "Нормальные" исключения (типа "файл с указанным именем не найден") никуда не делись и их никто менять на статическую типизацию не предлагает.

    S>Мы говорим не про исключения вообще, а про конкретную задачу процессинга ордеров.

    Где в твоей конкретной задаче место ошибкам программиста? Ответ — везде, потому что отлов оных происходит в рантайме, а не на этапе компиляции.

    На всякий случай еще раз повторю главное, потому что ты валишь все в кучу — и обработку данных, и обработку ошибок программиста, и непринужденно перескакиваешь с одного на другое.
    Типизация позволяет сделать процесс программирования более безопасным, предохраняя программиста от написания неправильного кода (думай про int/float вместо void*, или Class1/2/3 вместо Object, если Java тебе ближе). Всё. Пожалуйста, отталкивайся от этого, не вали все в кучу.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[64]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 10:35
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>А что в коде jazzer'а непонятно-то? Даже я понял.

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

    ARK>Э... какие фантазии? Исключения там не вылетает, проверок в рантайме нет. Поведение и надежность двух вариантов совершенно разные.

    "Там" — это где? Код про Load jazzer так и не показал. Единственный код, где есть Load — мой, и в нём рантайм проверки присутствуют независимо от наличия типизации.
    Если вам понятна идея jazzer, то, наверное, легко будет подправить мой код так, чтобы в нём исчезли рантайм проверки, или написать новый код LoadOrder.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[69]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 10:45
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Я же показал, чем тебя не устраивает try_to_change_amount?

    Вы что, шутите?
    Ок, давайте внимательно посмотрим на ваш try_to_change_amount:
    void try_to_change_amount(Order& o)
    {
      PROP_IF(o, has_risk(o), HasRisk) { // что это мы тут имеем? А! Это же... РАНТАЙМ ПРОВЕРКА!!! Которых у вас якобы нету!
        // а тут??? Мы что, тупо проигнорировали команду - и типа делаем вид, что всё нормально??? 
        // на самом деле тут, конечно же, будет throw - потому что ничего больше сделать нельзя.
      }
      PROP_ELSE(o) {
        increase_amount(o, 2.71);
      };
    }

    J>Где она падает, сорри? У меня такое чувство, что мы говорим о разных вещах.
    См. код выше. Вы ловко замели проблему "попытка увеличить amount для рискового ордера" под ковёр, ничего не скажешь. Просто сделаем вид, что такой попытки не было.

    Вашему двухслойному коду вполне эквивалентен вот такой:
    increase_amount(Order& o, Money amt)
    {
      if(o.HasRisk)
      {  // doing nothing 
      }
      else
      {
        o.Amount += amt;
      }
    }
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[68]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 12:27
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>Здравствуйте, Mamut, Вы писали:


    M>>Вот есть код, пусть даже гипотетический. Есть вопрос по коду и/или работе с кодом. Мне в ответ говорят «нет, тут бессмысленно это». Спрашиваю, «в чем бессмысленность? в чем принципиальное различие от ситуации X?». «принципиальное различие очевидно — в случае с типами программист может возложить на компилятор дополнительные проверки». И так — по кругу.


    ARK>Без типов:

    ARK>С типами:

    Ну, как всегда, «hello, world» во все поля. И опять же ноль ответов на вопрос: вот мы перенесли все эти «толпа кода» в одну функцию. Согласно Евгению, «все это не имеет смысла».

    ARK>Но вот беда, в другом месте мы забыли поставить этот ИФ и компилятор нам ничего не сказал:

    ARK>Теперь преимущество видно? В случае с GoodIncrease мы физически не можем передать невалидный аргумент. Да, мы можем ошибиться в заголовке или теле функции GoodIncrease, но эта ошибка будет ровно в одном месте.
    ARK>Вы скажете: "но это же просто статическая типизация, это совсем другое!". Нет, это абсолютно то же самое.
    ARK>Может быть, такой пример будет нагляднее.

    Только таких «примеров» у нас появляется хорошо, если два раза в год. И, не устану повторять: много сказок и удивительных историй
    Автор: Mamut
    Дата: 07.02.15
    про типы, а на практике все упирается в простейшие «hello, world»ы и «как бы нам не сложить апельсины с огурцами»


    dmitriid.comGitHubLinkedIn
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 12:29
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    void try_to_change_amount(Order& o)
    {
      PROP_IF(o, has_risk(o), HasRisk) { // что это мы тут имеем? А! Это же... РАНТАЙМ ПРОВЕРКА!!! Которых у вас якобы нету!
        // а тут??? Мы что, тупо проигнорировали команду - и типа делаем вид, что всё нормально??? 
        // на самом деле тут, конечно же, будет throw - потому что ничего больше сделать нельзя.
    
        // на самом деле тут НЕЛЬЗЯ вызвать increase_amount (компилятор запрещает) и никакого throw не будет
      }
      PROP_ELSE(o) {
        increase_amount(o, 2.71);
      };
    }


    S>Вашему двухслойному коду вполне эквивалентен вот такой:

    increase_amount(Order& o, Money amt)
    {
      if(o.HasRisk)
      {  // doing nothing 
    
         // а вот здесь, в отличие от предыдущего примера, нам компилятор не мешает делать что угодно, и будет throw
      }
      else
      {
        o.Amount += amt;
      }
    }
    Re[64]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 12:32
    Оценка:
    J>У тебя ошибка программиста — исключение в рантайме, если не отловилось тестами — ушло в продакшен.
    J>У меня ошибка программиста — ошибка компиляции, в продакшен уйти не может в принципе.

    Синклер задает тебе простой вопрос, от которого ты бегаешь, как черт от ладана (ты от него еще в разговоре со мной начал бегать).

    1. Мы загрузили заказ из базы
    2. Мы отправляем его на increase amount
    3. Если нельзя, мы должны показать юзеру осмысленную ошибку
    4. Если можно, мы увеличиваем

    Синклер просит показать, как у тебя реализуется пункт 3.


    dmitriid.comGitHubLinkedIn
    Re[64]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 12:38
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>В твоем случае increase_amount можно вызвать (в смысле, программист может неосторожным/злонамеренным движением вкопипастить вызов) откуда угодно, из любого кода, из любой ветки, для любого ордера в любом состоянии.

    Совершенно верно.
    J>В моем — только в одном месте, только для ордера, которому разрешено поднимать amount. Все остальные места вызовут ошибку компиляции.
    Зато try_change_amount можно вызвать откуда угодно, из любого кода, из любой ветки, для любого ордера в любом состоянии.
    Я же говорю — весь эффект от вашей работы, помимо нагрева атмосферы, — это перенос throw из increase_amount в её wrapper.

    J>У меня ошибка программиста — ошибка компиляции, в продакшен уйти не может в принципе.

    Не надо наделять ваш код волшебными свойствами. Ничего подобного в нём нет.

    J>Что есть? есть _уже_ корректно работающая система? так ей ничего не надо уже, она уже написана и уже работает, типы ей никак не помогут и не помешают. А вот при внесении изменений типы могу помочь не допустить ошибок при кодировании. Именно потому, что increase_amount можно вызвать только в одном месте.



    J>Если что — типы не о надежности работы кода (типа код не валится на неправильных данных — потому что это вопросы верификации данных), а о надежности процесса разработки (уменьшения вероятности ошибок кодирования).

    Совершенно верно. И ваш код не ловит никаких новых ошибок по сравнению с кодом без типов. Грубо говоря, единственная ошибка, которую умеет отлавливать ваш код — это вызов increase_amount вместо try_change_amount; но в "безтиповой" системе такой ошибки в принципе совершить нельзя, т.к. try_change_amount просто не существует.

    J>Есть сомнения в том, что программирование с int и float более безопасно в плане ошибок кодирования, чем программирование по нетипизированным адресам?

    В этом — сомнений нет. Но ваш пример — это как программирование c int и float, вот только все переменные имеют тип object. Поэтому все формулы выглядят вот так:
    object c = (int)a*(int)b; // TypeCastException в случае программистской ошибки.


    J>Если нет (ведь нет же, я надеюсь?), то почему есть тут?

    Потому, что вы фактически по-прежнему предлагаете программирование в терминах общего класса. Ведь в базе хранится именно он, а никакой попытки описать цепочки workflow, которые бы пересекали границу save/load вы не сделали.
    Поэтому ваши утверждения и остаются голословной теорией.

    J>На всякий случай еще раз повторю главное, потому что ты валишь все в кучу — и обработку данных, и обработку ошибок программиста, и непринужденно перескакиваешь с одного на другое.

    Я не перескакиваю. Это вы наделяете свой код волшебными свойствами, которых нет.

    J>Типизация позволяет сделать процесс программирования более безопасным,

    Ещё раз прошу: не надо булшита. Я по нему сам мастер спорта. Вам задают конкретный (ещё раз: конкретный) вопрос. Не надо переводить разговор в плоскость абстрактных понятий и моральных ценностей.
    Пока что продемонстрированный вами код заведомо не лучше того, который вы предлагаете заменить. И он запросто может оказаться хуже — просто потому, что его гораздо больше, а это означает увеличение площади, на которой можно сделать ошибку. Я не хочу пока копать в эту сторону, потому что это не имеет смысла — зачем обсуждать код, который не решил поставленную задачу. Вот когда мы напишем некий код, который научится решать проблему save/load без рантайм проверок, тогда можно будет искать в нём другие недостатки.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[69]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 12:38
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ну, как всегда, «hello, world» во все поля.


    Просто иллюстрация идеи — зачем это нужно.

    M>И опять же ноль ответов на вопрос: вот мы перенесли все эти «толпа кода» в одну функцию. Согласно Евгению, «все это не имеет смысла».


    Ну не можем же мы перенести всю систему в одну функцию. У вас же работа с заказами расположена не в одной функции? Заказы ходят по системе туда-сюда. Uипотетические "типизированные заказы" с собой таскают дополнительные свойства ("уже был проверен на валидность"). Важно — свойства таскают _типы_ по _потоку управления_! Речь не о свойствах реальных экземпляров заказов в работающей системе, а о свойствах переменных в программе.

    M>на практике все упирается в простейшие «hello, world»ы и «как бы нам не сложить апельсины с огурцами»


    С практикой сложнее, пока мейнстримовые языки такие штуки делать не позволяют (ну или позволяют, но через одно место), а языки, где это делать можно, либо маргинальные, либо слишком извращенные.
    Поэтому здесь все в основном пытаются проиллюстрировать идею — чем типы хороши в принципе. Ну, а со временем, возможно, и мейнстрим подтянется.
    Re[65]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 12:42
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>У тебя ошибка программиста — исключение в рантайме, если не отловилось тестами — ушло в продакшен.

    J>>У меня ошибка программиста — ошибка компиляции, в продакшен уйти не может в принципе.

    M>Синклер задает тебе простой вопрос, от которого ты бегаешь, как черт от ладана (ты от него еще в разговоре со мной начал бегать).


    M>1. Мы загрузили заказ из базы

    M>2. Мы отправляем его на increase amount
    M>3. Если нельзя, мы должны показать юзеру осмысленную ошибку
    M>4. Если можно, мы увеличиваем

    M>Синклер просит показать, как у тебя реализуется пункт 3.


    Можно я покажу?

    void try_to_change_amount(Order& o)
    {
      PROP_IF(o, has_risk(o), HasRisk) {
        show_verbose_error("Осмысленная ошибка");   // показываем осмысленную ошибку
      }
      PROP_ELSE(o) {
        increase_amount(o, 2.71);
      };
    }
    Re[65]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 12:48
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    ARK>>Э... какие фантазии? Исключения там не вылетает, проверок в рантайме нет. Поведение и надежность двух вариантов совершенно разные.


    S>"Там" — это где? Код про Load jazzer так и не показал. Единственный код, где есть Load — мой, и в нём рантайм проверки присутствуют независимо от наличия типизации.

    S>Если вам понятна идея jazzer, то, наверное, легко будет подправить мой код так, чтобы в нём исчезли рантайм проверки, или написать новый код LoadOrder.

    На C# написать такой (безопасный во время компиляции) код — нельзя. На С++ — можно.

    Код LoadOrder действительно не имеет значения, в нем ничего нет и не должно быть. Он просто загружает произвольный заказ, с произвольными свойствами.
    Re[65]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 13:00
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    J>>В твоем случае increase_amount можно вызвать (в смысле, программист может неосторожным/злонамеренным движением вкопипастить вызов) откуда угодно, из любого кода, из любой ветки, для любого ордера в любом состоянии.

    S>Совершенно верно.
    J>>В моем — только в одном месте, только для ордера, которому разрешено поднимать amount. Все остальные места вызовут ошибку компиляции.
    S>Зато try_change_amount можно вызвать откуда угодно, из любого кода, из любой ветки, для любого ордера в любом состоянии.
    S>Я же говорю — весь эффект от вашей работы, помимо нагрева атмосферы, — это перенос throw из increase_amount в её wrapper.

    Вызов try_change_amount к ошибке не приведет.
    Re[66]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 13:01
    Оценка: :)
    ARK>Можно я покажу?

    ARK>
    ARK>void try_to_change_amount(Order& o)
    ARK>{
    ARK>  PROP_IF(o, has_risk(o), HasRisk) {
    ARK>    show_verbose_error("Осмысленная ошибка");   // показываем осмысленную ошибку
    ARK>  }
    ARK>  PROP_ELSE(o) {
    ARK>    increase_amount(o, 2.71);
    ARK>  };
    ARK>}
    ARK>


    Ну то есть ровно то, о чем говорит
    Автор: Sinclair
    Дата: 27.02.15
    Синклер


    dmitriid.comGitHubLinkedIn
    Re[67]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 13:04
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ну то есть ровно то, о чем говорит
    Автор: Sinclair
    Дата: 27.02.15
    Синклер


    Ничего общего. У Синклера нет compile-time запрета на вызов increase_amount в невалидном контексте.

    Однако порожденный компилятором исполняемый код, вполне возможно, будет одинаковым (если, конечно, код Синклера не содержит ошибок).
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 13:04
    Оценка: :))
    M>>И опять же ноль ответов на вопрос: вот мы перенесли все эти «толпа кода» в одну функцию. Согласно Евгению, «все это не имеет смысла».

    ARK>Ну не можем же мы перенести всю систему в одну функцию. У вас же работа с заказами расположена не в одной функции? Заказы ходят по системе туда-сюда. Uипотетические "типизированные заказы" с собой таскают дополнительные свойства ("уже был проверен на валидность"). Важно — свойства таскают _типы_ по _потоку управления_! Речь не о свойствах реальных экземпляров заказов в работающей системе, а о свойствах переменных в программе.


    Я вот привел в пример кусок такой системы. Сразу же «не имеет смысла».

    И да, нифига они не таскают свойства типа «проверен на валидность». На практике такие проверки — это жгучая смесь из свойств самого заказа, закэшированных результатов в других системах, производных от кучи вещей (от суммы заказа до адреса доставки) и т.п.

    Вы тут рассказываете сказки про то, как все это будет прекрасно разруливаться типами, а на практике не можете решить с начала до конца простую задачу, на решение которой без у меня ушло 10 минут
    Автор: Mamut
    Дата: 06.02.15
    . Я боюсь представить, что произойдет, если вам дать действительно приближенную к реальности задачу
    Автор: Mamut
    Дата: 06.02.15



    M>>на практике все упирается в простейшие «hello, world»ы и «как бы нам не сложить апельсины с огурцами»


    ARK>С практикой сложнее, пока мейнстримовые языки такие штуки делать не позволяют (ну или позволяют, но через одно место), а языки, где это делать можно, либо маргинальные, либо слишком извращенные.

    ARK>Поэтому здесь все в основном пытаются проиллюстрировать идею — чем типы хороши в принципе. Ну, а со временем, возможно, и мейнстрим подтянется.

    Пока что вы не можете объяснить даже принципы Не говоря уже о том, что все апологеты постоянно противоречат друг другу


    dmitriid.comGitHubLinkedIn
    Re[65]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 13:08
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Синклер просит показать, как у тебя реализуется пункт 3.

    Похоже, что спасение рук утопающих.
    Меня на самом деле интересует не пункт 3, а гарантия того, что пункт 3 у нас заведомо отсутствует. (Я как бы отхожу в сторонку от твоей оригинальной задачи, пытаясь нащупать хоть какой-то путь вперёд).

    Ну вот, опять из общей теории: когда мы в С++ пытаемся вызвать private member, нам по рукам даёт компилятор. У нас нет никакой задачи "показать пользователю осмысленную ошибку в случае попытки вызова приватного мембера".

    Если рассмотреть отвлечённую задачу, то можно попробовать как-то так.

    Предположим, что у нас весь workflow — это цепочка вызовов, описанных в одной функции на псевдоязыке:
    processOrder(orderParams)
    {
       Order o = createNewOrder(orderParams)
    
       while(UI.doesUserWantToChangeTheOrder(o))
       {
         OrderChanges changes = UI.requestChanges(o);
         o = o.ApplyChanges(changes);
       }
       do
       {
         Payment payment = requestPayment(o.TotalAmount);
         try {
           checkedPayment = FraudChecker.checkFraud(payment, o);
           processedPayment = PaymentProcessor.Process(payment);
           o = o.ApplyPayment(processedPayment);
         } catch {}
       } while(!order.isPayed && UI.doesUserWantToProvideAnotherPaymentMethod);
       shippedOrder = ShipmentProcessor.SubmitShipment(o);
       deliveredOrder = ShipmentProcessor.WaitForDelivery(shippedOrder);
       if(UI.doesUserWantToReturnOrder(deliveredOrder))
       {
         ... 
       }
    }

    Пока вроде бы всё неплохо. Workflow — развесистый, на самом деле даже для такого простого сценария его втрое больше за счёт всяких побочных веток, которые в примере проигнорированы.
    Разметка типами позволяет нам предотвратить ситуации, когда программист добавил какой-нибудь if и закрыл скобку не там, и мы ухитряемся отправить неоплаченный заказ.
    Всё это — вполне достижимо теми самыми средствами, которые нам только что демонстрировали коллеги vdimas и jazzer.

    Теперь внимательно посмотрим на фрагмент между SubmitShipment и WaitForDelivery. Типизация позволяет нам гарантировать именно такой порядок вызова этих методов.
    Развитая типизация позволяет нам вставлять между ними ещё какие-то манипуляции с ордером, и компилятор будет позволять их, но не позволит переставить вызовы местами.
    Развитая система scope-инга позволяет нам обойтись без разнообразия имён типа shippedOrder и deliveredOrder, а везде использовать просто o, которое будет нужного нам типа в каждой точке.

    В итоге осталось представить себе то, что в промежутке между SubmitShipment и WaitForDelivery ордер на самом деле сбрасывается в базу.
    Но для прикладного программиста это (должно быть!) не более интересно, чем то, что код программа на С++ через кажлые несколько миллисекунд вытесняется из кэша процессора, EIP получает совсем другое значение, контекст потока перезагружается, и "следующая" операция может выполняться совсем другим процессором.
    А на С# между вызовами мог сработать уплотняющий GC, и только что записанные байты читаются совсем с другого адреса; тем не менее, безо всяких "проверок флагов" верификатор уже при загрузке программы нам гарантировал, что string мы прочитаем как string.

    Здесь — то же самое. Наш гипотетический компилятор workflow должен превратить наше спагетти в развесистый набор отдельных микропроцедурок типа DeliveryComplete(...) — очень похоже на yield return или на await. Внутри них уже не нужно проверять никакие флаги (предположим пока, что у нас нет проблемы десериализации ордера после замены версии кода ), потому что корректность порядка проверил компилятор.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 13:09
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>Здравствуйте, Sinclair, Вы писали:


    ARK>
    ARK>void try_to_change_amount(Order& o)
    ARK>{
    ARK>  PROP_IF(o, has_risk(o), HasRisk) { // что это мы тут имеем? А! Это же... РАНТАЙМ ПРОВЕРКА!!! Которых у вас якобы нету!
    ARK>    // а тут??? Мы что, тупо проигнорировали команду - и типа делаем вид, что всё нормально??? 
    ARK>    // на самом деле тут, конечно же, будет throw - потому что ничего больше сделать нельзя.
    
    ARK>    // на самом деле тут НЕЛЬЗЯ вызвать increase_amount (компилятор запрещает) и никакого throw не будет
    ARK>  }
    ARK>  PROP_ELSE(o) {
    ARK>    increase_amount(o, 2.71);
    ARK>  };
    ARK>}
    ARK>

    Вы что, издеваетесь???? а ЧТО там будет вместо throw? У автора стыдливо написано буквально следующее:

    // покажем сообшение об ошибке.

    Я, будучи склонен называть вещи своими именами, честно пишу здесь throw — потому что в коде бизнес-логики иного доступа к UI нету.
    А если есть возможность позвать здесь MsgBox, то я точно так же позову его изнутри increase_amount.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 13:13
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Я вот привел в пример кусок такой системы. Сразу же «не имеет смысла».


    Ну так иногда это действительно не имеет смысла. Класс заводить на одну int-переменную не имеет смысла. Из этого не следует, что классы не имеют смысла вообще.

    M>И да, нифига они не таскают свойства типа «проверен на валидность». На практике такие проверки — это жгучая смесь из свойств самого заказа, закэшированных результатов в других системах, производных от кучи вещей (от суммы заказа до адреса доставки) и т.п.


    Пусть так. Это ничему не противоречит.

    M>Вы тут рассказываете сказки про то, как все это будет прекрасно разруливаться типами, а на практике не можете решить с начала до конца простую задачу, на решение которой без у меня ушло 10 минут
    Автор: Mamut
    Дата: 06.02.15
    . Я боюсь представить, что произойдет, если вам дать действительно приближенную к реальности задачу
    Автор: Mamut
    Дата: 06.02.15


    Повторюсь еще раз:

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


    M>Пока что вы не можете объяснить даже принципы


    Скорее вы не хотите понять. Уже 4 человека пытаются объяснить, из них 3 очень умных. Вам не кажется, что это не просто так, что какой-то смысл за всем этим действительно есть?
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 13:16
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Вы что, издеваетесь???? а ЧТО там будет вместо throw?


    Что угодно, кроме вызова increase_amount.

    S>Я, будучи склонен называть вещи своими именами, честно пишу здесь throw — потому что в коде бизнес-логики иного доступа к UI нету.

    S>А если есть возможность позвать здесь MsgBox, то я точно так же позову его изнутри increase_amount.

    Ну, это другой вопрос. Это не имеет значения, что мы там будем делать. Может просто вернем заказ в текущем виде.
    Re[66]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 13:43
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>На C# написать такой (безопасный во время компиляции) код — нельзя. На С++ — можно.

    Пруф в студию.
    ARK>Код LoadOrder действительно не имеет значения, в нем ничего нет и не должно быть. Он просто загружает произвольный заказ, с произвольными свойствами.
    Это опять бла-бла. Покажите мне код, который хоть чем-то лучше кода с рантайм-проверками.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[66]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 13:44
    Оценка:
    Здравствуйте, AlexRK, Вы писали:
    ARK>Вызов try_change_amount к ошибке не приведет.
    А к чему он приведёт?
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 13:46
    Оценка: +1
    Здравствуйте, AlexRK, Вы писали:

    ARK>Ну, это другой вопрос. Это не имеет значения, что мы там будем делать. Может просто вернем заказ в текущем виде.

    Это называется "увиливать", или "юлить".
    Потому, что честный человек бы просто признался, что в обычном "нетипизированном" increase_amount() мы просто сделаем ровно то же, что и в вашей якобы "магической" try_change_amount.
    Например — вернём заказ в текущем виде.
    Ваш ход?
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[68]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 13:56
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>Ничего общего. У Синклера нет compile-time запрета на вызов increase_amount в невалидном контексте.

    Прекратите бредить, пожалуйста. В вашем коде зато нет compile-time запрета на вызов try_to_change_amount в невалидном контексте.
    Вы просто заменили одну небезопасную функцию на другую небезопасную функцию.
    Вот вам "код синклера":
    void increase_amount(Order& o, Money amt)
    {
      if(has_risk(o))
        show_verbose_error("Осмысленная ошибка");   // показываем осмысленную ошибку
      }
      else(o) {
        o.amount += amt;
      };
    }


    Вот вам пример кода, который приводит к runtime fault в вашем коде:
    ...
       Order o = create_order();
       o.SetRisk(10000);
       try_to_change_amount(o); 
    ...

    Этот код прекрасно компилируется, и в 100% запусков показывает "осмысленная ошибка".
    Каких ещё очевидных вещей вы не понимаете?
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 14:08
    Оценка: +1
    M>>Я вот привел в пример кусок такой системы. Сразу же «не имеет смысла».

    ARK>Ну так иногда это действительно не имеет смысла. Класс заводить на одну int-переменную не имеет смысла. Из этого не следует, что классы не имеют смысла вообще.


    Опять общие слова ни о чем

    M>>И да, нифига они не таскают свойства типа «проверен на валидность». На практике такие проверки — это жгучая смесь из свойств самого заказа, закэшированных результатов в других системах, производных от кучи вещей (от суммы заказа до адреса доставки) и т.п.

    ARK>Пусть так. Это ничему не противоречит.

    Раз не противоречит, решите задачу, наконец Пока что задачу решило два человека — Кодт и jazzer. При этом, оба решения неполные (из разряда «ну там далее и так понятно»).

    M>>Пока что вы не можете объяснить даже принципы


    ARK>Скорее вы не хотите понять. Уже 4 человека пытаются объяснить, из них 3 очень умных.


    Я вообще-то прекрасно пытаюсь понять. Любой вопрос упирается в демагогию, сказки и прочие мифы древней Греции.

    О. Кстати.

    К вопросу об этой ветке
    Автор: Sinclair
    Дата: 27.02.15
    . Почитай на несколько сообщений выше тут
    Автор: jazzer
    Дата: 05.02.15
    (и следующие 3 сообщения).

    Ты с jazzer'ом продолжаете говорить о том, что без типов придется бросать какие-то исключения, а с типами, типа, никаких исключений. Что является явной ложью И это выясняется при первом же наводящем вопросе
    Автор: Sinclair
    Дата: 27.02.15
    . И так — с каждым из «принципов»

    Хотя я не спорю, что в идеальной системе в идеальном состоянии
    Автор: Mamut
    Дата: 13.02.15
    что-то из того, что вы рассказываете, может иметь место.

    ARK> Вам не кажется, что это не просто так, что какой-то смысл за всем этим действительно есть?


    Может и есть, но пока что практически ни один из пропонентов не смог ни внятно объяснить принцип, ни показать пример сложнее «hello, world». Тут или проблема в том, что все это — сугубо теоретизирование, либо добровольное заблуждение (с ООП тоже что-то похожее было).


    dmitriid.comGitHubLinkedIn
    Re[66]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 14:13
    Оценка:
    S>Теперь внимательно посмотрим на фрагмент между SubmitShipment и WaitForDelivery. Типизация позволяет нам гарантировать именно такой порядок вызова этих методов.
    S>Развитая типизация позволяет нам вставлять между ними ещё какие-то манипуляции с ордером, и компилятор будет позволять их, но не позволит переставить вызовы местами.
    S>Развитая система scope-инга позволяет нам обойтись без разнообразия имён типа shippedOrder и deliveredOrder, а везде использовать просто o, которое будет нужного нам типа в каждой точке.

    У меня проблема с развитостью в том, что в итоге для того, чтобы создать непротиворечивую типизацию, которая все это будет отслеживать в (по сути — практически любых) комбинациях, надо нанять всех авторов Хаскеля и загрузить их работой на несколько лет

    В это время какой-нибудь очередной Цукерберг на PHP успеет поработить весь мир


    dmitriid.comGitHubLinkedIn
    Re[67]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 27.02.15 14:36
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>В это время какой-нибудь очередной Цукерберг на PHP успеет поработить весь мир


    При этом сделав статически типизированный PHP

    http://hacklang.org/
    Hack is a programming language for HHVM that interoperates seamlessly with PHP. Hack reconciles the fast development cycle of PHP with the discipline provided by static typing, while adding many features commonly found in other modern programming languages.

    Hack provides instantaneous type checking by incrementally checking your files as you edit them. It typically runs in less than 200 milliseconds, making it easy to integrate into your development workflow without introducing a noticeable delay.

    http://en.wikipedia.org/wiki/Hack_%28programming_language%29
    Hack is a programming language for the HipHop Virtual Machine (HHVM), created by Facebook as a dialect of PHP. The language implementation is open source, licensed under the BSD License.

    Отредактировано 27.02.2015 14:38 Evgeny.Panasyuk . Предыдущая версия .
    Re[67]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 14:39
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>У меня проблема с развитостью в том, что в итоге для того, чтобы создать непротиворечивую типизацию, которая все это будет отслеживать в (по сути — практически любых) комбинациях, надо нанять всех авторов Хаскеля и загрузить их работой на несколько лет

    C простыми флаг-предикатами прекрасно подойдёт решение vdimas.
    Оно вполне лаконично в подготовке (т.е. добавить новый флаг не очень трудно), и позволяет нам избежать экспоненциального взрыва количества типов.
    Просто описываем нужные нам требования в видe Order<Risk.Any, Payment.Applied, Delivery.NotStarted> — и поехали.
    Я вообще подозреваю, что даже придуманная мной утопия реализуется на соврменном шарпе в виде этого решения + await + кастомный шедулинг.

    Сложности начинаются, уже когда нужна не логика, а арифметика — даже целочисленная. В рантайме сравнить (текущий amount / 5) с increase_amount — легко.
    А вот статически доказать, что у нас в принципе не бывает ситуаций, когда мы увеличиваем amount больше чем на 20% — уже, как я понял, за пределами теоретической мощности.
    Я имею в виду что-то менее тривиальное, чем требование провести проверку немедленно перед вызовом — а когда компилятор может отследить все пути исполнения и сказать "спокойно чувак — переплаты не будет, я горантирую это".

    Ну и с многословными именами и разнотипностью o в разных ветках исполнения, как я понимаю, всё приемлемо только в функциональных языках.

    Не знаю, можно ли к ним приклеить вот этот вот "прозрачный persistence" и откат на шаг назад в случае сбоя транзакции.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[68]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 14:42
    Оценка:
    M>>В это время какой-нибудь очередной Цукерберг на PHP успеет поработить весь мир

    EP>При этом сделав статически типизированный PHP


    Они взлетели до того, как сделали статически типизированный PHP, если что.

    Более того:

    Traditionally, dynamically typed languages allow for rapid development but sacrifice the ability to catch errors early and introspect code quickly, particularly on larger codebases. Conversely, statically typed languages provide more of a safety net, but often at the cost of quick iteration. We believed there had to be a sweet spot.

    Thus, Hack was born. We believe that it offers the best of both dynamically typed and statically typed languages, and that it will be valuable to projects of all sizes.

    Type checking is incremental, such that even within a single file some code can be converted to Hack while the rest remains dynamically typed. Technically speaking, Hack is a “gradually typed*”* language: dynamically typed code interoperates seamlessly with statically typed code.

    Run-time enforcement of return types and parameter types (including scalar types like int and string) provides safety beyond what can be checked statically while type annotations are being gradually added to a codebase.



    dmitriid.comGitHubLinkedIn
    Re[68]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 14:46
    Оценка:
    S>Просто описываем нужные нам требования в видe Order<Risk.Any, Payment.Applied, Delivery.NotStarted> — и поехали.

    Хммм....http://rsdn.ru/forum/philosophy/5946213.1
    Автор: Mamut
    Дата: 06.02.15


    S>Сложности начинаются, уже когда нужна не логика, а арифметика — даже целочисленная. В рантайме сравнить (текущий amount / 5) с increase_amount — легко.

    S>А вот статически доказать, что у нас в принципе не бывает ситуаций, когда мы увеличиваем amount больше чем на 20% — уже, как я понял, за пределами теоретической мощности.
    S>Я имею в виду что-то менее тривиальное, чем требование провести проверку немедленно перед вызовом — а когда компилятор может отследить все пути исполнения и сказать "спокойно чувак — переплаты не будет, я горантирую это".

    По сути, вся моя ветка выше была как раз про это Но почему-то оно все скатывалось к «не дать возможности сложить апельсины с крокодилами — это тоже логика» :D


    А так да — я бы тоже хотел гарантированных проверок бизнес-логики любого уровня


    dmitriid.comGitHubLinkedIn
    Re[69]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 27.02.15 14:53
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    S>>Просто описываем нужные нам требования в видe Order<Risk.Any, Payment.Applied, Delivery.NotStarted> — и поехали.


    M>Хммм....http://rsdn.ru/forum/philosophy/5946213.1
    Автор: Mamut
    Дата: 06.02.15

    Ничего особенно страшного. Реально интересных нам типов будет немного, и для них мы введём синонимы типа PaidOrder = Order<*.Any, *.Any, *.Any, Payment.Applied, *.Any, ...>.
    И функция ApplyPayment будет требовать UnpaidOrder, а возвращать — PaidOrder.


    M>По сути, вся моя ветка выше была как раз про это Но почему-то оно все скатывалось к «не дать возможности сложить апельсины с крокодилами — это тоже логика» :D

    Ну это же форумный спор — никому не интересно спорить с реальным оппонентом. Лучше сдвинуть его на идиотскую позицию (вроде "типы вообще не нужны"), с блеском её опровергнуть, а на неудобные вопросы пространно отвечать удобными ответами.

    M>А так да — я бы тоже хотел гарантированных проверок бизнес-логики любого уровня

    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[69]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 27.02.15 14:54
    Оценка: +2
    Здравствуйте, Mamut, Вы писали:

    M>>>В это время какой-нибудь очередной Цукерберг на PHP успеет поработить весь мир

    EP>>При этом сделав статически типизированный PHP
    M>Они взлетели до того, как сделали статически типизированный PHP, если что.

    И теперь годами выплачивают свой technical debt — то PHP в C++ конвертируют, то делают свою PHP машину, то допиливают статическую типизацию и недостающие фичи. Но в принципе годная бизнес стратегия — где-то стреляет, где-то нет

    M>Более того:

    M>

    M>Thus, Hack was born. We believe that it offers the best of both dynamically typed and statically typed languages, and that it will be valuable to projects of all sizes.


    Ты не поверишь, но твои оппоненты в повседневной работе используют и статически и динамически типизированные языки, сочетая the best of both в необходимых пропорциях
    Re[67]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 14:58
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    ARK>>Вызов try_change_amount к ошибке не приведет.

    S>А к чему он приведёт?

    Ну, я не совсем верно выразился. Имелось в виду, что в нем не будет "незапланированной" ошибки. Зависит от реализации этого метода. Если мы руками кинем там исключение, то, конечно, вылетит исключение.
    Re[67]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 15:04
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, AlexRK, Вы писали:


    ARK>>На C# написать такой (безопасный во время компиляции) код — нельзя. На С++ — можно.

    S>Пруф в студию.
    ARK>>Код LoadOrder действительно не имеет значения, в нем ничего нет и не должно быть. Он просто загружает произвольный заказ, с произвольными свойствами.
    S>Это опять бла-бла. Покажите мне код, который хоть чем-то лучше кода с рантайм-проверками.

    Чем вам не нравится пост jazzer'a? http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15

    Видите там boost::enable_if? Функция increase_amount определена только в контексте, где на ее аргумент навешено требуемое свойство. C# такими шаблонными возможностями не обладает.
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 15:11
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, AlexRK, Вы писали:


    ARK>>Ну, это другой вопрос. Это не имеет значения, что мы там будем делать. Может просто вернем заказ в текущем виде.

    S>Это называется "увиливать", или "юлить".
    S>Потому, что честный человек бы просто признался, что в обычном "нетипизированном" increase_amount() мы просто сделаем ровно то же, что и в вашей якобы "магической" try_change_amount.
    S>Например — вернём заказ в текущем виде.
    S>Ваш ход?

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

    void try_to_change_amount(Order& o)
    {
      PROP_IF(o, possibly_has_risk(o), HasRisk) {
        BOOST_MPL_ASSERT_MSG(false, YOU_CANT_INCREASE_AMOUNT_FOR_SUCH_ORDER, (O));
      };
    
      ... дальше обычный код
    }


    Теперь у нас есть предусловие времени компиляции, гарантирующее, что на этапе исполнения функция try_to_change_amount вообще никогда не будет вызвана, если ее параметр предварительно не проверен (где-то выше) на HasRisk.

    Сделайте "ровно то же" у себя. Правда, вряд ли это получится.
    Отредактировано 27.02.2015 19:09 AlexRK . Предыдущая версия .
    Re[69]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 15:15
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>В вашем коде зато нет compile-time запрета на вызов try_to_change_amount в невалидном контексте.


    Есть.

    S>Вы просто заменили одну небезопасную функцию на другую небезопасную функцию.


    Нет.

    S>Вот вам пример кода, который приводит к runtime fault в вашем коде:

    ...
       Order o = create_order();
       o.SetRisk(10000);
       try_to_change_amount(o); 
    ...

    S>Этот код прекрасно компилируется, и в 100% запусков показывает "осмысленная ошибка".

    Этот код не скомпилируется. (Впрочем, зависит от реализации SetRisk, если мы там ошибочно забудем навесить на order предикат HasRisk, то действительно скомпилируется.)

    Прошу прощения, здесь я наврал. Этот код действительно скомпилируется, ведь мы предусмотрели возможность передачи в try_to_change_amount невалидного ордера.
    А вот если бы потребовали только валидный, как здесь — http://rsdn.ru/forum/philosophy/5967700?tree=tree
    Автор: AlexRK
    Дата: 27.02.15
    — то не скомпилируется.

    S>Каких ещё очевидных вещей вы не понимаете?


    Боюсь, это вы чего-то не понимаете.
    Отредактировано 27.02.2015 16:26 AlexRK . Предыдущая версия .
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 15:22
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Раз не противоречит, решите задачу, наконец Пока что задачу решило два человека — Кодт и jazzer. При этом, оба решения неполные (из разряда «ну там далее и так понятно»).


    Это будет объемный кусок кода. Я не готов писать его. Хелло ворлд особых усилий не требует, а решение такой задачи — определенно требует.

    Да и не вижу смысла, jazzer вон в своей портянке уж казалось бы все разжевал, ан нет — толку нет все равно.

    M>Ты с jazzer'ом продолжаете говорить о том, что без типов придется бросать какие-то исключения, а с типами, типа, никаких исключений. Что является явной ложью И это выясняется при первом же наводящем вопросе
    Автор: Sinclair
    Дата: 27.02.15
    . И так — с каждым из «принципов»


    Не знаю про "никаких" исключений, но иногда исключения действительно исчезают — точнее, превращаются в ошибки компиляции. Пример я приводил чуть выше: http://rsdn.ru/forum/philosophy/5967700?tree=tree
    Автор: AlexRK
    Дата: 27.02.15


    M>Может и есть, но пока что практически ни один из пропонентов не смог ни внятно объяснить принцип, ни показать пример сложнее «hello, world». Тут или проблема в том, что все это — сугубо теоретизирование, либо добровольное заблуждение (с ООП тоже что-то похожее было).


    Ну вы хотите, чтобы вам написали рабочую версию вашего требования, затратив на это день? ИМХО, жирновато для объяснения на форуме.
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 15:47
    Оценка:
    M>>>>В это время какой-нибудь очередной Цукерберг на PHP успеет поработить весь мир
    EP>>>При этом сделав статически типизированный PHP
    M>>Они взлетели до того, как сделали статически типизированный PHP, если что.

    EP>И теперь годами выплачивают свой technical debt


    Охохо. Кого это волнует, кроме акдемотеоретиков от типизации?


    EP>Ты не поверишь, но твои оппоненты в повседневной работе используют и статически и динамически типизированные языки, сочетая the best of both в необходимых пропорциях


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


    dmitriid.comGitHubLinkedIn
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 15:56
    Оценка:
    M>>Раз не противоречит, решите задачу, наконец Пока что задачу решило два человека — Кодт и jazzer. При этом, оба решения неполные (из разряда «ну там далее и так понятно»).

    ARK>Это будет объемный кусок кода. Я не готов писать его. Хелло ворлд особых усилий не требует, а решение такой задачи — определенно требует.


    Ахахахахахахаха что?

    ARK>Да и не вижу смысла, jazzer вон в своей портянке уж казалось бы все разжевал, ан нет — толку нет все равно.


    Толк есть, если вы слезете со своей колокольни, перестанете считать оппонентов идиотами и перестанете на простейшие вопросы отвечать простынями про то, как это хорошо или «и тут все понятно».

    Вначале я, а теперь и SInclair задают простые и внятные вопросы. Где на них простые внятные ответы?

    M>>Ты с jazzer'ом продолжаете говорить о том, что без типов придется бросать какие-то исключения, а с типами, типа, никаких исключений. Что является явной ложью И это выясняется при первом же наводящем вопросе
    Автор: Sinclair
    Дата: 27.02.15
    . И так — с каждым из «принципов»


    ARK>Не знаю про "никаких" исключений, но иногда исключения действительно исчезают — точнее, превращаются в ошибки компиляции. Пример я приводил чуть выше: http://rsdn.ru/forum/philosophy/5967700?tree=tree
    Автор: AlexRK
    Дата: 27.02.15


    Нафига мне твои ошибки компиляции, если мне надо информацию об этой ошибке надо сразу вывести пользователю? Это к вопросу о «нет толка», ага. Это мы виноваты, что вы не отвечаете на заданные вопросы?

    M>>Может и есть, но пока что практически ни один из пропонентов не смог ни внятно объяснить принцип, ни показать пример сложнее «hello, world». Тут или проблема в том, что все это — сугубо теоретизирование, либо добровольное заблуждение (с ООП тоже что-то похожее было).


    ARK>Ну вы хотите, чтобы вам написали рабочую версию вашего требования, затратив на это день? ИМХО, жирновато для объяснения на форуме.


    Что?! Вообще-то, «рабочая версия» моего требования пишется за 10 минут
    Автор: Mamut
    Дата: 06.02.15
    . Я это продемонстрировал. Или ты предпочитаешь и дальше просто разглагольствовать на отвелеченные темы, бегая от реальных примеров, как от огня?

    Это вообще реально смешно Простейшая задача на 10 минут на проверку оказывается неподъемной для апологетов типизации задачей, но при этом я должен им поверить на слово, что оно прекрасно работает для сложных задач и в прочие сказки
    Автор: Mamut
    Дата: 07.02.15
    .


    dmitriid.comGitHubLinkedIn
    Re[68]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 16:03
    Оценка:
    ARK>>>Вызов try_change_amount к ошибке не приведет.
    S>>А к чему он приведёт?

    ARK>Ну, я не совсем верно выразился. Имелось в виду, что в нем не будет "незапланированной" ошибки. Зависит от реализации этого метода. Если мы руками кинем там исключение, то, конечно, вылетит исключение.


    Что значит «незапланированная» ошибка?

    Order o = load_order_from_db();
    try_change_amount(o)


    От того, что в этом месте вылетит runtime type-error, никому легче не станет. Если ты начнешь рассказывать сказки про то, что компилятор не позволит написать неправильный load_error, мы возвращаемся к ветке про load_order
    Автор: Sinclair
    Дата: 24.02.15
    , в которой никто так и не осилил показать, как же этот load_order выглядит


    dmitriid.comGitHubLinkedIn
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 27.02.15 16:03
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>>>>>В это время какой-нибудь очередной Цукерберг на PHP успеет поработить весь мир

    EP>>>>При этом сделав статически типизированный PHP
    M>>>Они взлетели до того, как сделали статически типизированный PHP, если что.
    EP>И теперь годами выплачивают свой technical debt — то PHP в C++ конвертируют, то делают свою PHP машину, то допиливают статическую типизацию и недостающие фичи. Но в принципе годная бизнес стратегия — где-то стреляет, где-то нет
    M>Охохо. Кого это волнует, кроме акдемотеоретиков от типизации?

    Видимо того кто годами выплачивает этот долг, хотя мог бы пустить эти усилия на создание новых фич — может свой WhatsApp бы успели допилить, а не покупать его за надцать лярдов

    EP>>Ты не поверишь, но твои оппоненты в повседневной работе используют и статически и динамически типизированные языки, сочетая the best of both в необходимых пропорциях

    M>Именно. Пока что мои оппоненты занимаются сугубым теоретизированием и рассказыванием сказок, на практике внезапно оказывается, что на практике это никто не использует.

    Что "ЭТО"?
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 16:12
    Оценка:
    EP>Видимо того кто годами выплачивает этот долг, хотя мог бы пустить эти усилия на создание новых фич — может свой WhatsApp бы успели допилить, а не покупать его за надцать лярдов

    Это прекрасно, что ты в качестве примера, якобы подтверждающего твою точку зрения, ты приводишь приложение, написанное на насквозь динамическом Erlang'е

    И да. До WhatsApp'а у них уже был свой чатик сопоставимых масштабов, который — внезапно — тоже был написан на Erlang'е (справедливости ради должен сказать, что они перешли на C++[1], но не из-за динамики).

    EP>>>Ты не поверишь, но твои оппоненты в повседневной работе используют и статически и динамически типизированные языки, сочетая the best of both в необходимых пропорциях

    M>>Именно. Пока что мои оппоненты занимаются сугубым теоретизированием и рассказыванием сказок, на практике внезапно оказывается, что на практике это никто не использует.

    EP>Что "ЭТО"?


    Все ващи сказки про стат. типизацию. Я же говорю. Вы все — сугубые теоретики. Как доходит до практики, «это бессмысленно» и «в повседневной работе используют и статически и динамически типизированные языки, сочетая the best of both»


    [1] Парсер проглатывает ++ в C++


    dmitriid.comGitHubLinkedIn
    Отредактировано 27.02.2015 16:13 Mamut [ищите в других сетях] . Предыдущая версия .
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 16:24
    Оценка:
    S>>>Просто описываем нужные нам требования в видe Order<Risk.Any, Payment.Applied, Delivery.NotStarted> — и поехали.
    M>>Хммм....http://rsdn.ru/forum/philosophy/5946213.1
    Автор: Mamut
    Дата: 06.02.15

    S>Ничего особенно страшного. Реально интересных нам типов будет немного, и для них мы введём синонимы типа PaidOrder = Order<*.Any, *.Any, *.Any, Payment.Applied, *.Any, ...>.
    S>И функция ApplyPayment будет требовать UnpaidOrder, а возвращать — PaidOrder.

    Нууу... Сложно сказать. Из того, что я пока видел из предложенного в двух ветках, там на каждое условие придется писать свой тип/параметр типа, которые в некоторых местах вообще непонятно, как будут выглядеть (см. последнюю строчку).


    M>>По сути, вся моя ветка выше была как раз про это Но почему-то оно все скатывалось к «не дать возможности сложить апельсины с крокодилами — это тоже логика» :D

    S>Ну это же форумный спор — никому не интересно спорить с реальным оппонентом. Лучше сдвинуть его на идиотскую позицию (вроде "типы вообще не нужны"), с блеском её опровергнуть, а на неудобные вопросы пространно отвечать удобными ответами.

    Если это — камень в мой огород, то это не я, честно-честно Я прекрасно понимаю, когда мне говорят, что типы помогают не складывать апельсины с крокодилами и помогают при рефакторинге

    Но эти проблемы сильно преувеличены (не устаю говорить, что с проблемами апельсино-крокодилов мы практически не сталкиваемся). Я тут выступаю против http://rsdn.ru/forum/philosophy/5946930.1
    Автор: Mamut
    Дата: 07.02.15
    Потому что как только просишь показать это на чем-то более сложном, чем hello, world, все сыпется нафиг Или становится мегапереусложненным настолько, что отказываются даже показывать в виде мастер-класса
    Автор: AlexRK
    Дата: 27.02.15


    dmitriid.comGitHubLinkedIn
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 16:33
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Толк есть, если вы слезете со своей колокольни, перестанете считать оппонентов идиотами и перестанете на простейшие вопросы отвечать простынями про то, как это хорошо или «и тут все понятно».

    M>Вначале я, а теперь и SInclair задают простые и внятные вопросы. Где на них простые внятные ответы?

    Дайте, пожалуйста, ссылку на простой и внятный вопрос. Я постараюсь ответить.

    Вот был простой вопрос тут: http://rsdn.ru/forum/philosophy/5967520?tree=tree
    Автор: Mamut
    Дата: 27.02.15

    На него был дан ответ: http://rsdn.ru/forum/philosophy/5967526?tree=tree
    Автор: AlexRK
    Дата: 27.02.15


    "Реализуй мою кучерявую бизнес-логику" не является ни вопросом, ни простым.

    ARK>>Не знаю про "никаких" исключений, но иногда исключения действительно исчезают — точнее, превращаются в ошибки компиляции. Пример я приводил чуть выше: http://rsdn.ru/forum/philosophy/5967700?tree=tree
    Автор: AlexRK
    Дата: 27.02.15

    M>Нафига мне твои ошибки компиляции, если мне надо информацию об этой ошибке надо сразу вывести пользователю? Это к вопросу о «нет толка», ага. Это мы виноваты, что вы не отвечаете на заданные вопросы?

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

    M>Что?! Вообще-то, «рабочая версия» моего требования пишется за 10 минут
    Автор: Mamut
    Дата: 06.02.15
    . Я это продемонстрировал. Или ты предпочитаешь и дальше просто разглагольствовать на отвелеченные темы, бегая от реальных примеров, как от огня?

    M>Это вообще реально смешно Простейшая задача на 10 минут на проверку оказывается неподъемной для апологетов типизации задачей, но при этом я должен им поверить на слово, что оно прекрасно работает для сложных задач и в прочие сказки
    Автор: Mamut
    Дата: 07.02.15
    .


    Версия-то рабочая, только не факт, что свободная от ошибок. Так что к ней по хорошему еще килограмм тестов нужен.
    Записать это на типах будет, конечно, сложнее.
    Re[69]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 16:36
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    ARK>>Ну, я не совсем верно выразился. Имелось в виду, что в нем не будет "незапланированной" ошибки. Зависит от реализации этого метода. Если мы руками кинем там исключение, то, конечно, вылетит исключение.


    M>Что значит «незапланированная» ошибка?


    Это значит — брошенная рантаймом, а не операцией throw, явно написанной программистом в коде.

    M>
    M>Order o = load_order_from_db();
    M>try_change_amount(o)
    M>


    M>От того, что в этом месте вылетит runtime type-error, никому легче не станет.


    ААААА
    Здесь _не вылетит_ ошибка!

    M>Если ты начнешь рассказывать сказки про то, что компилятор не позволит написать неправильный load_error, мы возвращаемся к ветке про load_order
    Автор: Sinclair
    Дата: 24.02.15
    , в которой никто так и не осилил показать, как же этот load_order выглядит


    load_order может (и должен) быть ЛЮБЫМ, без каких-либо проверок.
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 27.02.15 16:39
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    EP>>Видимо того кто годами выплачивает этот долг, хотя мог бы пустить эти усилия на создание новых фич — может свой WhatsApp бы успели допилить, а не покупать его за надцать лярдов

    M>Это прекрасно, что ты в качестве примера, якобы подтверждающего твою точку зрения, ты приводишь приложение, написанное на насквозь динамическом Erlang'е

    Я и так знал что он написан на Erlang, что это меняет
    Мой поинт был о том, что пока они платили свой tech debt, их обскакали конкуренты, хотя казалось бы они были в более выгодных условиях.

    EP>>Что "ЭТО"?

    M>Все ващи сказки про стат. типизацию. Я же говорю.

    Статическая типизация позволяет поймать целый класс ошибок на стадии компиляции. Чем программирование более type rich, тем больше багов отлавливается типами. Согласен или считаешь что это сказки?

    M>Вы все — сугубые теоретики.


    Аргументы?

    M>Как доходит до практики, «это бессмысленно»


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

    M>и «в повседневной работе используют и статически и динамически типизированные языки, сочетая the best of both»


    Тебя удивляет то что для разных задач подходят разные инструменты? То что у разных инструментов свои плюсы и минусы?
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 16:49
    Оценка:
    ARK>Дайте, пожалуйста, ссылку на простой и внятный вопрос. Я постараюсь ответить.

    ARK>Вот был простой вопрос тут: http://rsdn.ru/forum/philosophy/5967520?tree=tree
    Автор: Mamut
    Дата: 27.02.15

    ARK>На него был дан ответ: http://rsdn.ru/forum/philosophy/5967526?tree=tree
    Автор: AlexRK
    Дата: 27.02.15


    ARK>"Реализуй мою кучерявую бизнес-логику" не является ни вопросом, ни простым.


    Ахахахаха. Вопрос на три условия
    Автор: Mamut
    Дата: 05.02.15
    — это «кучерявая бизнес-логика». Ну-ну.

    M>>Нафига мне твои ошибки компиляции, если мне надо информацию об этой ошибке надо сразу вывести пользователю? Это к вопросу о «нет толка», ага. Это мы виноваты, что вы не отвечаете на заданные вопросы?


    ARK>Этой ошибки в программе не будет, показывать пользователю нечего.


    Вот почему я называю вас сугубо теоретиками. Это не «ошибка» — это вполне штатное условие. Пришел запрос от магазина — повысить сумму заказа. Мы обязаны ему ответить, почему это невозможно (а не «этой ошибки не будет»).

    ARK>Где-то (не в этом месте, скорее всего гораздо выше) будет проверка, удовлетворяет ли ордер условию HasRisk. Возможно (но не факт, зависит от требований) в том месте может быть показано какое-то сообщение пользователю.


    Где — выше? И да, проверок — не одна. Вот он, кстати. Внятный вопрос. Он выглядит так: покажи мало-мальски полноценное решение, а не отмазывайся общими фразами.

    M>>Что?! Вообще-то, «рабочая версия» моего требования пишется за 10 минут
    Автор: Mamut
    Дата: 06.02.15
    . Я это продемонстрировал. Или ты предпочитаешь и дальше просто разглагольствовать на отвелеченные темы, бегая от реальных примеров, как от огня?

    M>>Это вообще реально смешно Простейшая задача на 10 минут на проверку оказывается неподъемной для апологетов типизации задачей, но при этом я должен им поверить на слово, что оно прекрасно работает для сложных задач и в прочие сказки
    Автор: Mamut
    Дата: 07.02.15
    .


    ARK>Версия-то рабочая, только не факт, что свободная от ошибок. Так что к ней по хорошему еще килограмм тестов нужен.


    Факт, что свободная.

    ARK>Записать это на типах будет, конечно, сложнее.


    Ну запиши же, ну. Покажи мастер класс. Почему я тебе должен верить на слово, что все великолепие типов раскроется в гораздо более сложном приложении, если вы так и не осилили полноценное решение для трех условий? (ну или четырех, не суть важно)

    Моя настоящая кучерявая бизнес-логика — вот она: http://rsdn.ru/forum/philosophy/5946213.1
    Автор: Mamut
    Дата: 06.02.15
    И вы ее точно не осилите.


    dmitriid.comGitHubLinkedIn
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 16:50
    Оценка:
    M>>
    M>>Order o = load_order_from_db();
    M>>try_change_amount(o)
    M>>


    M>>От того, что в этом месте вылетит runtime type-error, никому легче не станет.


    ARK>ААААА

    ARK>Здесь _не вылетит_ ошибка!

    Почему она не вылетит? Как ты там говоришь? «Зависит от реализации метода»?

    M>>Если ты начнешь рассказывать сказки про то, что компилятор не позволит написать неправильный load_error, мы возвращаемся к ветке про load_order
    Автор: Sinclair
    Дата: 24.02.15
    , в которой никто так и не осилил показать, как же этот load_order выглядит


    ARK>load_order может (и должен) быть ЛЮБЫМ, без каких-либо проверок.


    Хорошо. Опиши мне полностью код — от load_order -> increase_amount -> try_increase_amount

    Покажи, что будет, если напрямую будет вызван try_increae_amount

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


    dmitriid.comGitHubLinkedIn
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 16:58
    Оценка:
    EP>Я и так знал что он написан на Erlang, что это меняет
    EP>Мой поинт был о том, что пока они платили свой tech debt, их обскакали конкуренты, хотя казалось бы они были в более выгодных условиях.

    Конкурентов на стат. языках вообще нет. Так что твой пойнт про то, что якобы tech debt не позволил фейсбуку что-то там сделать, вообще невалиден.

    Ах да, whatsapp не был конкурентом фейсбуку.

    EP>>>Что "ЭТО"?

    M>>Все ващи сказки про стат. типизацию. Я же говорю.

    EP>Статическая типизация позволяет поймать целый класс ошибок на стадии компиляции. Чем программирование более type rich, тем больше багов отлавливается типами. Согласен или считаешь что это сказки?


    Сказки. Потому что как только просишь тебя показать это на примерах — идет 100 страниц обсуждения, а потом «тут это бессмысленно». Все «больше багов» в итоге скатываются к «мы не сможем передать сюда integer, если нужен string». Любые прямые и/или наводящие вопросы или просто вопросы в стиле «покажи на практике» разбиваются обо все большие
    Автор: Evgeny.Panasyuk
    Дата: 07.02.15
    стены текста ни о чем и «это очевидно», «с этим нельзя спорить» и «тут и так понятно».



    M>>Как доходит до практики, «это бессмысленно»

    EP>Surprise, забивать гвозди мультиметром бессмысленно, что никак не отменяет его достоинств.

    Вот она. Махровая демагогия.

    EP>То что для одной конкретной задачи пытаться переложить проверки на типы не имеет смысла — не делает твою экстраполяцию на все задачи сколько-нибудь близкой к реальности.


    Это — обычная задача. Как ты там выше говорил? «Чем программирование более type rich, тем больше багов отлавливается типами». Ну, покажи мастер класс. По любому
    Автор: Mamut
    Дата: 07.02.15
    из этих заявлений. Пока что все упирается в «это бессмысленно» и «если предусловий нет, то бессмысленно» и прочая и прочая и прочая


    dmitriid.comGitHubLinkedIn
    Re[77]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 16:59
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ахахахаха. Вопрос на три условия
    Автор: Mamut
    Дата: 05.02.15
    — это «кучерявая бизнес-логика». Ну-ну.


    Это не вопрос и не на 3 условия.

    ARK>>Этой ошибки в программе не будет, показывать пользователю нечего.

    M>Вот почему я называю вас сугубо теоретиками. Это не «ошибка» — это вполне штатное условие. Пришел запрос от магазина — повысить сумму заказа. Мы обязаны ему ответить, почему это невозможно (а не «этой ошибки не будет»).

    Если в требованиях это есть — то это сообщение будет там, где проверяется это условие. И это будет явно не функция increase_amount.

    ARK>>Где-то (не в этом месте, скорее всего гораздо выше) будет проверка, удовлетворяет ли ордер условию HasRisk. Возможно (но не факт, зависит от требований) в том месте может быть показано какое-то сообщение пользователю.

    M>Где — выше? И да, проверок — не одна.

    Там, где проверяется условие. В общем, это не имеет никакого отношения к самой идее.

    M>Вот он, кстати. Внятный вопрос. Он выглядит так: покажи мало-мальски полноценное решение, а не отмазывайся общими фразами.


    Это не вопрос.

    ARK>>Версия-то рабочая, только не факт, что свободная от ошибок. Так что к ней по хорошему еще килограмм тестов нужен.

    M>Факт, что свободная.

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

    ARK>>Записать это на типах будет, конечно, сложнее.

    M>Ну запиши же, ну. Покажи мастер класс. Почему я тебе должен верить на слово, что все великолепие типов раскроется в гораздо более сложном приложении, если вы так и не осилили полноценное решение для трех условий? (ну или четырех, не суть важно)

    Может быть позже, если настроение будет. Но вообще хотелось бы сократить эту задачу до минимального размера. В книжках примеры дают абстрактные, для иллюстрации идеи, а не портянки из приложений.
    Вы абстрактную идею понять, увы, не можете (без того, чтобы увидеть именно свою логику).
    Re[78]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 17:08
    Оценка:
    M>>Ахахахаха. Вопрос на три условия
    Автор: Mamut
    Дата: 05.02.15
    — это «кучерявая бизнес-логика». Ну-ну.

    ARK>Это не вопрос и не на 3 условия.

    Да ну. Их там четыре? О ужас!

    ARK>Если в требованиях это есть — то это сообщение будет там, где проверяется это условие. И это будет явно не функция increase_amount.


    Почему не эта функция? Где это будет?

    ARK>Там, где проверяется условие. В общем, это не имеет никакого отношения к самой идее.


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

    ARK>>>Версия-то рабочая, только не факт, что свободная от ошибок. Так что к ней по хорошему еще килограмм тестов нужен.

    M>>Факт, что свободная.
    ARK>Ну, сейчас свободная, а через полгода будет ошибочная, когда требования изменятся.

    Поэтому и вопрос виде задачи. Ты почитай. Там как раз с определением новых требований.

    ARK>>>Записать это на типах будет, конечно, сложнее.

    M>>Ну запиши же, ну. Покажи мастер класс. Почему я тебе должен верить на слово, что все великолепие типов раскроется в гораздо более сложном приложении, если вы так и не осилили полноценное решение для трех условий? (ну или четырех, не суть важно)

    ARK>Может быть позже, если настроение будет. Но вообще хотелось бы сократить эту задачу до минимального размера.


    То есть до hello world'a. Потому что ничего сложнее hello world'а, видимо, на типах написать нельзя. Ну почему ты продолжаешь подтверждать мое мнение?

    ARK>В книжках примеры дают абстрактные, для иллюстрации идеи, а не портянки из приложений.


    Не надо никаких «абстрактных примеров». Я этих абстрактных примеров уже накушался. Я привел в качестве примера вполне себе минимальную задачу. Она тебе не нравится, потому что в пух и прах разносит твои утвержлдения про то, какая стат. типизация крутая? Ну извини, у нас 99% задач — такие.

    ARK>Вы абстрактную идею понять, увы, не можете (без того, чтобы увидеть именно свою логику).


    Ну так вы делаете все, что угодно, чтобы ничего не объяснять.

    Это выглядит так:

    Мы: есть пример/задача
    Вы: вот частичное решение
    Мы: А что если изменится условие или вызов будет вот таким?
    Вы: тонна текста про то, как все будет круто
    Мы: ну на примере хотя бы
    Вы: там очевидно
    Мы: ээээ. а пример решения?
    Вы: поставишь в другом месте проверку
    Мы: пример?
    Вы: тебе не ясно, что стат. типизация круто это отловит?
    Мы: эээ. ну ты не показал. нам не «все очевидно»
    Вы: вот пример (ссылка на частичное решение, вызвавшее вопросы), что там непонятно
    Мы: ну вот же вопрос, что будет, если A, B, C
    Вы: я все разжевал, что тебе непонятно
    ad infinitum


    Sinclair даже специально уменьшил всю мою задачу до «минимального примера». Не, даже там нет щастя.


    dmitriid.comGitHubLinkedIn
    Re[78]: Про минимальные примеры и учебники
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 17:24
    Оценка:
    ARK>Но вообще хотелось бы сократить эту задачу до минимального размера. В книжках примеры дают абстрактные, для иллюстрации идеи, а не портянки из приложений.

    — В книге по C++ (Deitel & Deitel, емнип) создавали пример работающего лифта
    — В книге по Эрлангу создают распределенный чат
    — В книгах по Схеме/Лиспу пишут компиляторы
    — В книгах по Скале задачи типа Discrete event simulation
    — В Большой Книге РСДНа по Статической Типизации ищут минимальный абстрактный пример. Видимо потому что теория очень плохо ложится на практику.



    dmitriid.comGitHubLinkedIn
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 18:31
    Оценка: 21 (1)
    Здравствуйте, Mamut, Вы писали:

    ARK>>ААААА

    ARK>>Здесь _не вылетит_ ошибка!

    M>Почему она не вылетит? Как ты там говоришь? «Зависит от реализации метода»?


    Ошибка вылетит только в том случае, если мы сами ее бросим — оператором throw.

    ARK>>load_order может (и должен) быть ЛЮБЫМ, без каких-либо проверок.


    M>Хорошо. Опиши мне полностью код — от load_order -> increase_amount -> try_increase_amount

    M>Покажи, что будет, если напрямую будет вызван try_increae_amount
    M>Покажи, что делать, когда проверки изменяются/добавляются.

    Псевдокод:
      Order o = load_order();  // загружен произвольный заказ
    
      //increase_amount(o, 2.71);  - напрямую вызвали increase_amount - ошибка компиляции, условие HasRisk не равно false
    
      PROP_IF(o, not_has_risk(o), HasRisk) {
        increase_amount(o, 2.71);   // компилируется, условие HasRisk проверено и строго равно false
      }


    Теперь у нас есть функция, содержащая increase_amount внутри:
    void try_to_change_amount(Order& o)
    {
      // если HasRisk равно true или неизвестно - то ошибка компиляции (не runtime!)
      PROP_IF(o, possibly_has_risk(o), HasRisk) {
        BOOST_MPL_ASSERT_MSG(false, YOU_CANT_INCREASE_AMOUNT_FOR_SUCH_ORDER, (O));
      };
    
      increase_amount(o, 2.71);  // в этой точке у нас заказ точно не HasRisk
    }
    
    ...
    
      Order o = load_order();  // загружен произвольный заказ
    
      //try_increase_amount(o);   - ошибка компиляции, свойства заказа не проверены
    
      PROP_IF(o, not_has_risk(o), HasRisk) {
        try_increase_amount(o);   // работает, не будет ни ошибки времени компиляции, ни ошибки времени выполнения
      }
      PROP_ELSE(o) {
        // здесь, если есть такое требование, можем показать сообщение пользователю, что с заказом что-то не то
      }


    Добавили проверку на OtherProp:
    struct OtherProp;
    
    template<class O> using can_increase_amount = bm::and<
      CheckExact<O, HasRisk, bm::false_>,
      CheckExact<O, OtherProp, bm::false_>>;
    
    
    ...
    
      Order o = load_order();  // загружен произвольный заказ
    
    
      PROP_IF(o, not_has_risk(o), HasRisk) {
        //increase_amount(o, 2.71);   // уже НЕ компилируется! перестало!
    
        PROP_IF(o, is_other_prop_valid(o), OtherProp)
        {
          increase_amount(o, 2.71);   // а вот тут компилируется и гарантированно не вылетает в рантайме - все свойства проверены
        }
        PROP_ELSE(o) {
          // если надо, можем тут показать сообщение "у заказа нет OtherProp"
        }
      }
      PROP_ELSE(o) {
        // если надо, можем тут показать сообщение "заказ рисковый"
      }
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 27.02.15 18:39
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Конкурентов на стат. языках вообще нет. Так что твой пойнт про то, что якобы tech debt не позволил фейсбуку что-то там сделать, вообще невалиден.


    Конечно можно спорить о том, что может даже при отсутствии tech debt у них не было whatsapp. Но то что они тратят много усилий выплату долга, пытаясь добавить статическую типизацию тем или иным способом — это факт, тут-то не о чем спорить

    M>Ах да, whatsapp не был конкурентом фейсбуку.


    Да неужели? А как же Facebook Messenger?
    К моменту покупки у whatsapp было несколько сот лямов пользователей и быстрый темп роста. Причём эти брюки лёгким движением руки могли превратится в нечто большее чем просто messenger. Не был бы конкурентом — его бы и не купили за надцать лярдов.

    M>>>Все ващи сказки про стат. типизацию. Я же говорю.

    EP>>Статическая типизация позволяет поймать целый класс ошибок на стадии компиляции. Чем программирование более type rich, тем больше багов отлавливается типами. Согласен или считаешь что это сказки?
    M>Сказки. Потому что как только просишь тебя показать это на примерах — идет 100 страниц обсуждения, а потом «тут это бессмысленно».

    На твой конкретный пример я в первом же своём сообщении
    Автор: Evgeny.Panasyuk
    Дата: 07.02.15
    сказал:

    EP>Вообще, всё зависит от пред/пост-условий требуемой функции, и соответственно мест в которых она используется.
    EP>Если в её предусловия входит выполнение всех этих ограничений/условий, то без предварительных проверок её запускать нельзя. И соответственно все эти проверки надо городить в месте каждого вызова (либо удостовериться в их выполнении другими способами) — то в этом случае форсирование этих условий системой типов имеет смысл.
    EP>Если же для запуска функции нет необходимости делать проверки, change_amount сама всё что нужно проверяет внутри, и более того её запуск с невыполненными условиями не является ошибкой, а вполне штатным режимом — то пытаться переписать все эти внутренние проверки на типы, не вижу смысла, это никак не отразится на местах вызова этой функции.


    M>Все «больше багов» в итоге скатываются к «мы не сможем передать сюда integer, если нужен string». Любые прямые и/или наводящие вопросы или просто вопросы в стиле «покажи на практике» разбиваются обо все большие
    Автор: Evgeny.Panasyuk
    Дата: 07.02.15
    стены текста ни о чем и «это очевидно», «с этим нельзя спорить» и «тут и так понятно».

    M>

    Твоё "покажи на практике" означает "покажи на моём конкретном опердне, шах и мат атеистыстатическая типизация!", а отнюдь не общепринятое "покажи разные примеры".
    А потом нецелесообразность логики на типах в твоём конкретном опердне, ты экстраполируешь на все возможные примеры

    EP>>То что для одной конкретной задачи пытаться переложить проверки на типы не имеет смысла — не делает твою экстраполяцию на все задачи сколько-нибудь близкой к реальности.

    M>Это — обычная задача. Как ты там выше говорил? «Чем программирование более type rich, тем больше багов отлавливается типами». Ну, покажи мастер класс.

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

    M>По любому
    Автор: Mamut
    Дата: 07.02.15
    из этих заявлений.


    По первому же:

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


    Некий объект XYZ задаётся массивом индексов. Порядок индексов для конкретной задачи не важен — то есть перестановка индексов XYZ соответствует ему же.
    Эти XYZ нужно использовать как ключи поиска в хэш-таблицах или сбалансированных деревьях. Для этой цели удобно иметь нормальную форму, например требовать чтобы индексы XYZ были отсортированы в каком-то единообразном порядке.
    Если использовать обычные массивы для передачи XYZ между функциями, то у нас нет гарантии что кто-то где-то не забудет отсортировать индексы — то есть это фрагменты рисунка одинаковой формы, которые можно перепутать.
    Можно ввести дополнительный класс, который в качестве инварианта будет гарантировать отсортированность, а в остальном вести себя точно также как массив. То есть это уже фрагмент рисунка со специальной формой, и использовать вместо него фрагмент другой не получится, по крайней мере в статически типизированном языке. В динамически типизированном языке такой гарантии нет. И даже, как ты говоришь, "шальной юнит-тест" это не отловит, так как у отсортированного и не отсортированного массива одинаковый интерфейс.

    M>Пока что все упирается в «это бессмысленно» и «если предусловий нет, то бессмысленно» и прочая и прочая и прочая


    И что тебя смущает?
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 27.02.15 18:57
    Оценка: 21 (1) +1
    Здравствуйте, Mamut, Вы писали:

    ARK>>ААААА

    ARK>>Здесь _не вылетит_ ошибка!
    M>Почему она не вылетит? Как ты там говоришь? «Зависит от реализации метода»?


    Мне кажется вы тут о разных вещах говорите. Давай договоримся, а какую же все-таки задачу мы решаем.
    Очевидно, что рантайм данные проверить в компайл-тайме невозможно. Невозможно компилятором проверить правильно ли начислены бонусы на заказ, так же очевидно компилятор никогда не проверит правильно ли ты заимплементил бизнес-логику. Но есть вещи которые компилятором проверить очень даже можно и приведенный пример с PROP_IF это и демонстрирует.

    Как и следует из названия рантайм проверки должны проверять ошибки пользователя. А компайл-тайм ошибки программиста.
    А чуть ли не самая частая ошибка выглядит так:
    Order order = getOrder // неважно откуда
    
    if (! order.property.valid) // а если тут программист забыл проверку
    throw Something
    
    process(order) // то тут случилось страшное.


    Так вот приведенный выше пример не дает программисту забыть проверку. А уж реакции на ошибку и прочие обработки одинаковы вне зависимости от системы типов

    PS. другое дело, что подобная проблема прекрасно решаема и без продвинутой системы типов
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 19:17
    Оценка: :)
    M>>Сказки. Потому что как только просишь тебя показать это на примерах — идет 100 страниц обсуждения, а потом «тут это бессмысленно».

    EP>На твой конкретный пример я в первом же своём сообщении
    Автор: Evgeny.Panasyuk
    Дата: 07.02.15
    сказал:

    EP>

    EP>>Вообще, всё зависит от пред/пост-условий требуемой функции, и соответственно мест в которых она используется.


    Еще раз повторю. Все эти условия никуда не делись. Они остались там же — перед собственно увеличением суммы заказа. По какой-то только тебе известной причине ВНЕЗАПНО стат типизация ВНЕЗАПНО перестала иметь смысл.



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

    EP>Твоё "покажи на практике" означает "покажи на моём конкретном опердне, шах и мат атеистыстатическая типизация!", а отнюдь не общепринятое "покажи разные примеры".


    Ага. Если бы вы хоть раз привели бы разные примеры. На сотом уровне обсуждений ты наконец-то один раз осилил привести один такой пример (и то не факт, что они именно показывает все преимущества заявляемой вами стат. типизации)

    EP>А потом нецелесообразность логики на типах в твоём конкретном опердне, ты экстраполируешь на все возможные примеры


    Нет. Я экстраполирую твои общие рассуждения на общий пример.


    M>>Это — обычная задача. Как ты там выше говорил? «Чем программирование более type rich, тем больше багов отлавливается типами». Ну, покажи мастер класс.

    EP>Я не говорил что обогащать типами можно любую задачу до бесконечности.

    Я не предлагаю до бесконечности. Я предлагаю хотя бы как-то. Но даже как-то у вас или не рожается или рожается со скрипом и пинками


    EP>По первому же:

    EP>

    EP>Если ты когда-нибудь собирал мозаичные пазлы, то должен был заметить, что различная форма фрагментов рисунка позволяет избежать большинства ошибок и резко ускорить выполнение задачи. Типы в любой логике выполняют примерно туже самую роль.


    EP>Если использовать обычные массивы для передачи XYZ между функциями, то у нас нет гарантии что кто-то где-то не забудет отсортировать индексы — то есть это фрагменты рисунка одинаковой формы, которые можно перепутать.


    Передаем проверку на отсортированность/сортировку в одно место — и оппа «это становится бессмысленно» ©™

    EP>Можно ввести дополнительный класс, который в качестве инварианта будет гарантировать отсортированность, а в остальном вести себя точно также как массив. То есть это уже фрагмент рисунка со специальной формой, и использовать вместо него фрагмент другой не получится, по крайней мере в статически типизированном языке. В динамически типизированном языке такой гарантии нет. И даже, как ты говоришь, "шальной юнит-тест" это не отловит, так как у отсортированного и не отсортированного массива одинаковый интерфейс.


    В статической типизации это будет выглядеть как-то так, как я понимаю:
    function use(SortedArray s){
    }
    
    Array a = new Array(1, 5, 7);
    SortedArray sa = new SortedArray(sa);
    
    //use a выдаст ошибку компиляции
    use(sa);


    В динамическом
    %% вводим приватный тип, недоступный снаружи
    -redord(sorted, {s}).
    
    use(L) when is_list(L) ->
      use(sorted(L));
    use(#sorted{s = Sorted}) ->
      ...
    
    sorted(L) ->
      #sorted{s = lists:sort(L)}.


    Как ты там говоришь? Ах да. «В этом примере это бессмысленно» ©™ Потому что, как там «нет предусловий».

    Понятно, что — О УЖАС — кто-то может передать сюда не массив, а что-то страшное, например объект. Но вот незадача... В системе, в прошлом году сгенерировавшей миллиард евро оборота, такие пробелмы вылезают — ну, два раза в год

    M>>Пока что все упирается в «это бессмысленно» и «если предусловий нет, то бессмысленно» и прочая и прочая и прочая

    EP>И что тебя смущает?

    Смущает, ваше (пропонентов стат. типизации) неконтролируемое словоблудие, которое на практике выливается в ноль примеров и сплошные «нам эти примеры не нравятся» и «тут это бессмысленно».


    dmitriid.comGitHubLinkedIn
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 19:18
    Оценка:
    ARK>
    ARK>  PROP_IF(o, not_has_risk(o), HasRisk) {
    ARK>    //increase_amount(o, 2.71);   // уже НЕ компилируется! перестало!
    
    ARK>    PROP_IF(o, is_other_prop_valid(o), OtherProp)
    ARK>    {
    ARK>      increase_amount(o, 2.71);   // а вот тут компилируется и гарантированно не вылетает в рантайме - все свойства проверены
    ARK>    }
    ARK>    PROP_ELSE(o) {
    ARK>      // если надо, можем тут показать сообщение "у заказа нет OtherProp"
    ARK>    }
    ARK>  }
    ARK>  PROP_ELSE(o) {
    ARK>    // если надо, можем тут показать сообщение "заказ рисковый"
    ARK>  }
    ARK>


    А теперь контрольный вопрос: каким образом это все будет проверяться на правильность. Ну то есть, что все эти if-ы расставлены правильно?


    dmitriid.comGitHubLinkedIn
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 19:30
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>А теперь контрольный вопрос: каким образом это все будет проверяться на правильность. Ну то есть, что все эти if-ы расставлены правильно?


    Ну, в расстановке ифов ошибиться не выйдет — если ифа нет, то код, содержащий проверку предиката, не скомпилируется. Лишний иф добавить можно, но он вреда не принесет.
    (Понятно, что если проверок предикатов нет, то все будет компилироваться, но мы таким образом просто перенесли эти проверки в рантайм.)

    Ошибиться можно где-то в определении функции, которая требует некий предикат — в нашем случае это increase_amount (если мы там ошибемся, то вылетит ошибка в рантайме). Но таких мест на каждую функцию одно, а вызовов таких функций обычно больше. Если в коде всего один вызов increase_amount, то смысла во всем этом нет. А если этих вызовов пара десятков, то бенефит получить можно (в теории, т.к. в конкретном случае могут иметь бОльшее значение другие факторы, например скорость разработки).
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 19:40
    Оценка:
    M>>А теперь контрольный вопрос: каким образом это все будет проверяться на правильность. Ну то есть, что все эти if-ы расставлены правильно?

    ARK>Ну, в расстановке ифов ошибиться не выйдет — если ифа нет, то код, содержащий проверку предиката, не скомпилируется. Лишний иф добавить можно, но он вреда не принесет.


    Ахахахахаха что? Вообще-то ты этими if'ами реализуешь бизнес логику. Как ты собираешься проверять, что все эти ифы и предикаты расставлены правильно?

    То есть каким образом ты будешь проверять, что все проверки сделаны правильно и в нужном порядке?


    ЗЫ. Это я умолчу, что между этими разными if'ами могут и будут вызовы других функций. Так, если ты все же осилишь прочитать мой пример, ты увидишь там чтение конфигурации перед одной из проверок.


    dmitriid.comGitHubLinkedIn
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 27.02.15 20:08
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>>>А теперь контрольный вопрос: каким образом это все будет проверяться на правильность. Ну то есть, что все эти if-ы расставлены правильно?

    ARK>>Ну, в расстановке ифов ошибиться не выйдет — если ифа нет, то код, содержащий проверку предиката, не скомпилируется. Лишний иф добавить можно, но он вреда не принесет.
    M>Ахахахахаха что? Вообще-то ты этими if'ами реализуешь бизнес логику. Как ты собираешься проверять, что все эти ифы и предикаты расставлены правильно?

    Я имею в виду, что мы не допустим провала проверки, заложенной в нашем предикате "can_increase_amount". А ифы... можно напортачить с ними с какой-то иной точки зрения, но это ничем не отличается от других ошибок реализации, например, если вместо "+" написали "-", или вместо "56" написали "62". Описываемый мной пример не претендует на отлов всех ошибок. А вот ошибиться с условием "increase_amount может быть вызван только для заказа, у которого HasRisk=false" нельзя, его правильность гарантирована компилятором (при условии, что сам предикат написан верно).

    M>То есть каким образом ты будешь проверять, что все проверки сделаны правильно и в нужном порядке?


    Для "can_increase_amount" имеет значение только то, что проверки уже где-то сделаны. Где и в каком порядке, ему все равно. Он как сторож: есть паспорт — заходи, нет — проваливай.

    M>ЗЫ. Это я умолчу, что между этими разными if'ами могут и будут вызовы других функций. Так, если ты все же осилишь прочитать мой пример, ты увидишь там чтение конфигурации перед одной из проверок.


    Да пусть будут. Нам они не мешают. Я сейчас рассуждаю с точки зрения контроля условия "increase_amount может быть вызван только для заказа, у которого HasRisk=false". А так конечно, помимо этого в коде могут быть разные ошибки, чего об этом говорить. Ну или может я не понял вопроса.
    Re[77]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 27.02.15 20:21
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    EP>>На твой конкретный пример я в первом же своём сообщении
    Автор: Evgeny.Panasyuk
    Дата: 07.02.15
    сказал:

    EP>>

    EP>>>Вообще, всё зависит от пред/пост-условий требуемой функции, и соответственно мест в которых она используется.

    M>Еще раз повторю. Все эти условия никуда не делись. Они остались там же — перед собственно увеличением суммы заказа. По какой-то только тебе известной причине ВНЕЗАПНО стат типизация ВНЕЗАПНО перестала иметь смысл.
    M>

    Если вызов твоей функции с невыполненными условия не является ошибкой, а вполне штатным состоянием с чётким контрактом — то эти условия не являются предусловиями. Ещё раз, прочитай наконец что означают термины пред/пост-условия — http://en.wikipedia.org/wiki/Precondition

    M>При том, что рядом же другие пропоненты заявляют, что логику на типах, банить неправильные вызовы и т.п.


    Для некоторых задач это имеет смысл, для той конкретной которую ты описал в том отдельном топике — не имеет. Они же видимо говорят в общем (например когда функцию с предусловиями нужно вызывать из разных мест).

    EP>>Твоё "покажи на практике" означает "покажи на моём конкретном опердне, шах и мат атеистыстатическая типизация!", а отнюдь не общепринятое "покажи разные примеры".

    M>Ага. Если бы вы хоть раз привели бы разные примеры. На сотом уровне обсуждений ты наконец-то один раз осилил привести один такой пример (и то не факт, что они именно показывает все преимущества заявляемой вами стат. типизации)

    Я тебе приводил примеры с аффинным пространством и Mars Climate Orbiter, забыл?

    EP>>А потом нецелесообразность логики на типах в твоём конкретном опердне, ты экстраполируешь на все возможные примеры

    M>Нет. Я экстраполирую твои общие рассуждения на общий пример.

    Какие именно — про то что нужны предусловия для демонстрации кодирования логики на типах?
    И как же ты экстраполируешь? Мол "предусловия никогда не нужны" -> логика на типах это сказки

    M>>>Это — обычная задача. Как ты там выше говорил? «Чем программирование более type rich, тем больше багов отлавливается типами». Ну, покажи мастер класс.

    EP>>Я не говорил что обогащать типами можно любую задачу до бесконечности.
    M>Я не предлагаю до бесконечности. Я предлагаю хотя бы как-то. Но даже как-то у вас или не рожается или рожается со скрипом и пинками

    Как-то: вместо безликих amount'ов введи тип MoneyUSD или что там у вас

    M>Передаем проверку на отсортированность/сортировку в одно место — и оппа «это становится бессмысленно» ©™


    Каким образом? Типа assert(x is Sorted)? Так я об этом уже говорил:

    Считай перед вызовом каждой функции расставляются виртуальные assert'ы, которые отрабатывают на этапе компиляции.
    В динамических же языках эти assert'ы подразумеваются, но никак не энфорсятся. И соответственно чем больше программа, тем больше вероятность что какая-то из ошибок подобного рода будет пропущена. Если вероятность пропуска/фейла одного такого assert'а 0.01, то уже для 230 мест вероятность пропуска хотя бы одного будет 0.9.
    И даже 100% покрытие строчек кода тестами не даёт гарантии что все ошибки этого класса найдены.


    M>В статической типизации это будет выглядеть как-то так, как я понимаю:

    M>
    M>function use(SortedArray s){
    M>}
    
    M>Array a = new Array(1, 5, 7);
    M>SortedArray sa = new SortedArray(sa);
    
    M>//use a выдаст ошибку компиляции
    M>use(sa);
    M>


    Таких use-ов, то есть мест где требуется SortedArray, может быть много.

    M>В динамическом

    M>
    M>%% вводим приватный тип, недоступный снаружи
    M>-redord(sorted, {s}).
    
    M>use(L) when is_list(L) ->
    M>  use(sorted(L));
    M>use(#sorted{s = Sorted}) ->
    M>  ...
    
    M>sorted(L) ->
    M>  #sorted{s = lists:sort(L)}.
    M>

    M>Понятно, что — О УЖАС — кто-то может передать сюда не массив, а что-то страшное, например объект.

    То есть, грубо говоря, для каждого параметра ты предлагаешь ввести проверку типа (в общем случае assert(x is Y)), и расставлять её вручную в каждом месте? И зачем грызть этот кактус? Почему бы не взять инструмент который эти assert'ы проверит в compile-time, для всех возможных путей выполнения, а не только тех которые описаны в юнит-тестах?

    M>Но вот незадача... В системе, в прошлом году сгенерировавшей миллиард евро оборота,


    А я не говорил что на динамическом языке нельзя создать надёжную систему

    M>такие пробелмы вылезают — ну, два раза в год


    А Mars Climate Oribter из-за такой вот проблемы рассыпался в атмосфере Марса, только и всего

    M>>>Пока что все упирается в «это бессмысленно» и «если предусловий нет, то бессмысленно» и прочая и прочая и прочая

    EP>>И что тебя смущает?
    M>Смущает, ваше (пропонентов стат. типизации) неконтролируемое словоблудие,

    Ты до сих пор не удосужился посмотреть определение precondtion, при этом пытаешься что-то о них говорить, а теперь вообще скатываешься в хамство

    M>которое на практике выливается в ноль примеров и сплошные «нам эти примеры не нравятся» и «тут это бессмысленно».


    Почему тебя удивляет то, что в некоторых примерах применять технологию X нецелесообразно?
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 21:57
    Оценка: :)
    Здравствуйте, AlexRK, Вы писали:

    ARK>Здравствуйте, Mamut, Вы писали:


    M>>>>А теперь контрольный вопрос: каким образом это все будет проверяться на правильность. Ну то есть, что все эти if-ы расставлены правильно?

    ARK>>>Ну, в расстановке ифов ошибиться не выйдет — если ифа нет, то код, содержащий проверку предиката, не скомпилируется. Лишний иф добавить можно, но он вреда не принесет.
    M>>Ахахахахаха что? Вообще-то ты этими if'ами реализуешь бизнес логику. Как ты собираешься проверять, что все эти ифы и предикаты расставлены правильно?

    ARK>Я имею в виду,


    [скипнуто множество словоблудия, которое так и не ответило на прямой, внятный, простейшй вопрос].


    dmitriid.comGitHubLinkedIn
    Re[78]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.02.15 22:07
    Оценка:
    EP>Если вызов твоей функции с невыполненными условия не является ошибкой, а вполне штатным состоянием с чётким контрактом — то эти условия не являются предусловиями. Ещё раз, прочитай наконец что означают термины пред/пост-условия — http://en.wikipedia.org/wiki/Precondition

    Да плевать я хотел на твои пред/после и прочие условия.

    В стопятидесятый раз повторяю.

    
    ----> точка входа в функцию X
    
         if
         if
         if
         if
         if
    
         ----> точка входа в функцию Y



    Ты увтерждаешь, что «ах-ах-ах-ах, типы прекрасно разруливают предусловия». То есть ты говоришь про функцию Y.

    Теперь внимание, следим за руками. Ничего не изменилось, но мы смотрим на код с точки зрения точки входа в функцию X.

    ВНЕЗАПНО!! У тебя возникает «ну в этом случае стат. типизация бессмысленна». При этом ты продолжаешь меня оскорблять, мол, я нихера не понимаю.



    EP>>>Твоё "покажи на практике" означает "покажи на моём конкретном опердне, шах и мат атеистыстатическая типизация!", а отнюдь не общепринятое "покажи разные примеры".

    M>>Ага. Если бы вы хоть раз привели бы разные примеры. На сотом уровне обсуждений ты наконец-то один раз осилил привести один такой пример (и то не факт, что они именно показывает все преимущества заявляемой вами стат. типизации)

    EP>Я тебе приводил примеры с аффинным пространством и Mars Climate Orbiter, забыл?


    Я же говворю: на сотом уровне топиков один пример с афинным пространством. Про Orbiter у тебя была спекуляция, для которой я показал, что в зависимости от выбранного протокола никакая стат. типизация не помогает.

    Но да, но да. Именно я виноват в том, что я не прошу разных примеров, ага. А не вы, которые предпочитаете словоблудствовать на сотню страниц

    M>>Я не предлагаю до бесконечности. Я предлагаю хотя бы как-то. Но даже как-то у вас или не рожается или рожается со скрипом и пинками


    EP>Как-то: вместо безликих amount'ов введи тип MoneyUSD или что там у вас


    1. Нахер надо?
    2. Что это даст?

    M>>Передаем проверку на отсортированность/сортировку в одно место — и оппа «это становится бессмысленно» ©™


    EP>Каким образом? Типа assert(x is Sorted)? Так я об этом уже говорил:


    Вау. Каким образом в стат. типизации будет проверено, что массив отсортированный? Магическим способом и святым духом?


    EP>То есть, грубо говоря, для каждого параметра ты предлагаешь ввести проверку типа (в общем случае assert(x is Y)), и расставлять её вручную в каждом месте? И зачем грызть этот кактус?


    Действительно, почему бы не расставлять вручную по всему коду приведение к SortedArray? Те же яйца, вид сбоку.

    EP> Почему бы не взять инструмент который эти assert'ы проверит в compile-time, для всех возможных путей выполнения, а не только тех которые описаны в юнит-тестах?


    Потому что даже отсутсвие такого инструмента приводит к двум ошибкам в год.

    M>>такие пробелмы вылезают — ну, два раза в год

    EP>А Mars Climate Oribter из-за такой вот проблемы рассыпался в атмосфере Марса, только и всего

    У нас система, написанная на Java со стат. типизацией прекрасно показывала некорректное поведение, несмотря на стат. типизацию. Пример я приводил. И?

    M>>которое на практике выливается в ноль примеров и сплошные «нам эти примеры не нравятся» и «тут это бессмысленно».

    EP>Почему тебя удивляет то, что в некоторых примерах применять технологию X нецелесообразно?

    Потому что ты и остальные вещаешь о том, как все мегакруто. На практике все сводится к «ой, это нам позволит не складывать апельсины и крокодилов». Прекрасно, но это — мизерная часть задач.


    dmitriid.comGitHubLinkedIn
    Re[79]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 27.02.15 23:26
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Да плевать я хотел на твои пред/после и прочие условия.


    Q.E.D.

    M>Ты увтерждаешь, что «ах-ах-ах-ах, типы прекрасно разруливают предусловия». То есть ты говоришь про функцию Y.

    M>Теперь внимание, следим за руками. Ничего не изменилось, но мы смотрим на код с точки зрения точки входа в функцию X.
    M>ВНЕЗАПНО!! У тебя возникает «ну в этом случае стат. типизация бессмысленна». При этом ты продолжаешь меня оскорблять, мол, я нихера не понимаю.

    1. Y может использоваться из разных мест.
    2. В разных контекстах проверки могут иметь разную форму, работать с разными наборами данных, хотя по сути будут проверять одно и тоже свойстов/предусловие. И далеко не все эти проверки можно собрать в одной функции X.
    3. Далеко не всегда проверки можно вызывать несколько раз подряд — это может поломать инварианты/постусловия. Чтобы вызывать Y несколько раз, придётся вызывать несколько раз X, что приведёт к повторным проверкам.
    4. И наконец, далеко не всегда предусловия можно проверить — даже однократная проверка может поломать инварианты/постусловия, либо вообще может быть невозможна физически.

    M>Про Orbiter у тебя была спекуляция, для которой я показал, что в зависимости от выбранного протокола никакая стат. типизация не помогает.


    Если протокол не типизированный, либо реализации генерируются не из одной схемы — то типизация не поможет. Но это ошибка рода ODR-violation — в разных модулях один и тот же тип определён по разному

    M>Но да, но да. Именно я виноват в том, что я не прошу разных примеров, ага. А не вы, которые предпочитаете словоблудствовать на сотню страниц


    M>>>Я не предлагаю до бесконечности. Я предлагаю хотя бы как-то. Но даже как-то у вас или не рожается или рожается со скрипом и пинками

    EP>>Как-то: вместо безликих amount'ов введи тип MoneyUSD или что там у вас
    M>1. Нахер надо?

    Догадайся:

    EP>>Я не говорил что обогащать типами можно любую задачу до бесконечности.
    M>Я не предлагаю до бесконечности. Я предлагаю хотя бы как-то. Но даже как-то у вас или не рожается или рожается со скрипом и пинками


    M>2. Что это даст?


    Например предотвратит передачу MoneyAUD в MoneyUSD, или например радикально сократит количество перестановок аргументов валидных с точки зрения типов

    M>>>Передаем проверку на отсортированность/сортировку в одно место — и оппа «это становится бессмысленно» ©™

    EP>>Каким образом? Типа assert(x is Sorted)? Так я об этом уже говорил:
    M>Вау. Каким образом в стат. типизации будет проверено, что массив отсортированный? Магическим способом и святым духом?

    Sorted это тип.

    EP>>То есть, грубо говоря, для каждого параметра ты предлагаешь ввести проверку типа (в общем случае assert(x is Y)), и расставлять её вручную в каждом месте? И зачем грызть этот кактус?

    M>Действительно, почему бы не расставлять вручную по всему коду приведение к SortedArray? Те же яйца, вид сбоку.

    То есть расставлять assert на каждый тип параметра? По структуре получится практически тоже самое что и в статически типизированном языке (там где в статическом будет описан тип параметра — у тебя будет assert), за тем минусом что проверки динамические и не факт что все ошибки этого рода вылезут при юнит-тестах.
    Но какие из преимуществ динамического языка тогда останутся?

    EP>> Почему бы не взять инструмент который эти assert'ы проверит в compile-time, для всех возможных путей выполнения, а не только тех которые описаны в юнит-тестах?

    M>Потому что даже отсутсвие такого инструмента приводит к двум ошибкам в год.

    Найденным?

    M>У нас система, написанная на Java со стат. типизацией прекрасно показывала некорректное поведение, несмотря на стат. типизацию. Пример я приводил. И?


    И что? На динамическом языке можно написать корректную и надёжную программу, и наоборот — на статическом некорректную и ненадёжную

    EP>>Почему тебя удивляет то, что в некоторых примерах применять технологию X нецелесообразно?

    M>Потому что ты и остальные вещаешь о том, как все мегакруто. На практике все сводится к «ой, это нам позволит не складывать апельсины и крокодилов». Прекрасно, но это — мизерная часть задач.

    Это сводится, как минимум, к автоматическим assert'ам на каждый аргумент каждой функции, проверяемым в compile-time
    Re[77]: AlexRK, а что ты лыбишься?
    От: Mamut Швеция http://dmitriid.com
    Дата: 28.02.15 08:24
    Оценка:
    M>[скипнуто множество словоблудия, которое так и не ответило на прямой, внятный, простейшй вопрос].

    Я не понимаю, AlexRK, что ты лыбишься. Ты ныл, что тебе не задают внятных вопросов. Вот тебе был внятный вопрос:

    Как ты собираешься проверять, что все эти ифы и предикаты расставлены правильно? То есть каким образом ты будешь проверять, что все проверки сделаны правильно и в нужном порядке?


    Где на него ответ? Ты написал простыню текста, которая к моему вопросу вообще не имеет никакого отношения. А потом еще удивляешься, когда я вас называю словоблудами и демагогами, неспособными ответить на простейшие вопросы


    dmitriid.comGitHubLinkedIn
    Re[80]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 28.02.15 08:30
    Оценка: -1
    M>>Ты увтерждаешь, что «ах-ах-ах-ах, типы прекрасно разруливают предусловия». То есть ты говоришь про функцию Y.
    M>>Теперь внимание, следим за руками. Ничего не изменилось, но мы смотрим на код с точки зрения точки входа в функцию X.
    M>>ВНЕЗАПНО!! У тебя возникает «ну в этом случае стат. типизация бессмысленна». При этом ты продолжаешь меня оскорблять, мол, я нихера не понимаю.

    EP>1. может

    EP>2. могут иметь
    EP>3. можно
    EP>4. можно

    Может. Возможно. Может. Возможно. Это мы уже проходили
    Автор: Mamut
    Дата: 26.02.15
    :

    Чем дальше, тем любопытсвеннее © Чем дальше, тем более идиотские странные условия должны выполниться, чтобы мы наконец-то увидели всю мощь и красоту типов


    Я уже понял. Типы помогают, когда умный человек, который грамотно расставил все типы, при этом занимается copy-paste программингом (так, чтобы код был лапшой из вызовов).

    Ты все равно не отвечаешь на простой вопрос: в чем принципиальная разница между лапшой, в которой типы так прекрасно помогают, и рефакторингом, в котором все эти «предусловия» без изменений просто переносятся в одну функцию.

    M>>Про Orbiter у тебя была спекуляция, для которой я показал, что в зависимости от выбранного протокола никакая стат. типизация не помогает.


    EP>Если протокол не типизированный, либо реализации генерируются не из одной схемы — то типизация не поможет. Но это ошибка рода ODR-violation — в разных модулях один и тот же тип определён по разному


    О, еще один со стат. типизированным протоколом. Тебе сюда: http://rsdn.ru/forum/philosophy/5952778
    Автор: Mamut
    Дата: 13.02.15


    EP>>>Как-то: вместо безликих amount'ов введи тип MoneyUSD или что там у вас

    M>>1. Нахер надо?

    EP>Догадайся:

    EP>

    Я предлагаю хотя бы как-то


    Я догадался: шобы було. Просто шобы було.

    M>>2. Что это даст?


    EP>Например предотвратит передачу MoneyAUD в MoneyUSD, или например радикально сократит количество перестановок аргументов валидных с точки зрения типов


    Опять сплошная демагогия. У нас в насквозь динамической системе нет радикального количества перестановок аргументов

    M>>>>Передаем проверку на отсортированность/сортировку в одно место — и оппа «это становится бессмысленно» ©™

    EP>>>Каким образом? Типа assert(x is Sorted)? Так я об этом уже говорил:
    M>>Вау. Каким образом в стат. типизации будет проверено, что массив отсортированный? Магическим способом и святым духом?

    EP>Sorted это тип.


    И что? Перечитай еще раз выделенное. Я просто использую твою логику. Убираем «предусловия». Переносим проверку в одну функцию, и все «это становится бессмысленно» ©

    EP>Но какие из преимуществ динамического языка тогда останутся?


    Вопрос должен быть поставлен наоборот: какие из преимуществ стат. языка останутся?

    EP>>> Почему бы не взять инструмент который эти assert'ы проверит в compile-time, для всех возможных путей выполнения, а не только тех которые описаны в юнит-тестах?

    M>>Потому что даже отсутсвие такого инструмента приводит к двум ошибкам в год.

    EP>Найденным?


    А только они имеют смысл Я же говорю вы все — сугубые теортетики. Не найденные нас не интересуют, от слова «вообще». Нас гораздо больше интересует бизнес-логика. Но в ней, мы уже выяснили, стат. типизация не помогает, от слова вообще.

    M>>У нас система, написанная на Java со стат. типизацией прекрасно показывала некорректное поведение, несмотря на стат. типизацию. Пример я приводил. И?

    EP>И что? На динамическом языке можно написать корректную и надёжную программу, и наоборот — на статическом некорректную и ненадёжную

    Нет. И на том и на другом языке можно напичать как надежную, так и ненадежную систему. Пока что ни ты, ни один из твоих оппонентов не показал, каким образом стат. типизация прямо таки мега помогает писать надежные системы. Любые наводящие вопросы растворяются в словоблудии и наборе все более абсурдных условий, в которых она (якобы) помогает.

    EP>>>Почему тебя удивляет то, что в некоторых примерах применять технологию X нецелесообразно?

    M>>Потому что ты и остальные вещаешь о том, как все мегакруто. На практике все сводится к «ой, это нам позволит не складывать апельсины и крокодилов». Прекрасно, но это — мизерная часть задач.

    EP>Это сводится, как минимум, к автоматическим assert'ам на каждый аргумент каждой функции, проверяемым в compile-time


    Выделенное.


    dmitriid.comGitHubLinkedIn
    Re[68]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.15 18:55
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>Чем вам не нравится пост jazzer'a? http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15

    Тем, что там нету Load, зато есть runtime-проверки.

    ARK>Видите там boost::enable_if? Функция increase_amount определена только в контексте, где на ее аргумент навешено требуемое свойство. C# такими шаблонными возможностями не обладает.

    Дело не в C#. Дело в том, что jazzer приписывает своему коду свойства, которых там и в помине нет. И вы его зачем-то поддерживаете
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.15 19:01
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>Теперь у нас есть предусловие времени компиляции, гарантирующее, что на этапе исполнения функция try_to_change_amount вообще никогда не будет вызвана, если ее параметр предварительно не проверен (где-то выше) на HasRisk.

    То есть мы отлавливаем ошибку отсутствия if(hasRisk) выше по стеку?
    Да, изобразить это без буста не удастся. Впрочем, полезность этой процедуры не больше нуля. Забыть сделать проверку выше по стеку ничуть не более вероятно, чем забыть сделать проверку прямо в этой функции. Поэтому в результате мы имеем программу, в которой написаны две проверки на наличие риска — одна статическая на шаблонах, а другая — рантайм.
    Ну, либо программист забыл добавить первую из них, и компилятор ничем ему не помог.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.15 19:06
    Оценка: +1
    Здравствуйте, AlexRK, Вы писали:

    ARK>Прошу прощения, здесь я наврал. Этот код действительно скомпилируется, ведь мы предусмотрели возможность передачи в try_to_change_amount невалидного ордера.

    ARK>А вот если бы потребовали только валидный, как здесь — http://rsdn.ru/forum/philosophy/5967700?tree=tree
    Автор: AlexRK
    Дата: 27.02.15
    — то не скомпилируется.

    ARK>Боюсь, это вы чего-то не понимаете.
    Омг. Кошмар на улице Вязов — 5. "Мы спим! Он завставляет нас бегать по кругу!"

    Я вам напомню, что функция, в которую не было предусмотрено передачи невалидного ордера, у нас уже была. Это increase_amount.
    Сигнатуру try_to_change_amount пришлось "испортить" из-за того, что есть функция LoadOrder, которая умеет загружать только "неизвестно какие" ордера.
    Именно поэтому jazzer в ответ на вопросы про эту функцию пишет много слов и ноль кода
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.15 19:38
    Оценка: +1
    Здравствуйте, AlexRK, Вы писали:
    ещё раз: всё, чего вы добились — это делегирования ответственности за коммуникацию с пользователем на уровень выше.

    Т.е. в случае незатейливой increase_amount в ней все требования проверяются динамически, и в случае их нарушения пользователь получает Message Box с объяснением причин.
    А вы предлагаете обязать программиста, использующего increase_amount, провести проверки до вызова, чтобы в случае провала проверок пользователь получил MessageBox с объяснением причин.

    Единственная проблема, которую ваше "решение" решает — это обеспечение разных текстов ошибок в разных контекстах (ну или, скажем, чтобы вызовы через web получали 400 bad request, а вызовы из rich application показывали MessageBox). Но для этой проблемы есть старое и гораздо более удобное решение — выброс исключений. Обязанность коммуницировать с пользователем делегируется вверх по стеку; а сам набор проверок гарантированно выполняется благодаря инкапсуляции.

    От статической типизации ожидают большего — например, сокращения количества рантайм-проверок, путём исключения избыточных.
    Пока что в данной задаче ничего подобного продемонстрировано не было.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[77]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 02.03.15 09:52
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Понятно, что — О УЖАС — кто-то может передать сюда не массив, а что-то страшное, например объект. Но вот незадача... В системе, в прошлом году сгенерировавшей миллиард евро оборота, такие пробелмы вылезают — ну, два раза в год


    Ну кстати это не аргумент. Может конкретно в вашей системе огромное количество денег, сил и времени тратится на написание тестов, которые можно было б не тратить в статических языках?

    Иными словами это всего-лишь один пример, а надо говорить про статистику.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[78]: AlexRK, а что ты лыбишься?
    От: genre Россия  
    Дата: 02.03.15 09:52
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Я не понимаю, AlexRK, что ты лыбишься. Ты ныл, что тебе не задают внятных вопросов. Вот тебе был внятный вопрос:

    M>

    M>Как ты собираешься проверять, что все эти ифы и предикаты расставлены правильно? То есть каким образом ты будешь проверять, что все проверки сделаны правильно и в нужном порядке?


    M>Где на него ответ? Ты написал простыню текста, которая к моему вопросу вообще не имеет никакого отношения. А потом еще удивляешься, когда я вас называю словоблудами и демагогами, неспособными ответить на простейшие вопросы


    очевидно, проверять ровно так же как и в любом другом языке. Никакая типизация и никакой язык программирования не поможет тебе если ты неправильно перенес логику из требований в код. Непонятно почему у тебя вообще возник такой вопрос.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[79]: AlexRK, а что ты лыбишься?
    От: Mamut Швеция http://dmitriid.com
    Дата: 02.03.15 12:41
    Оценка:
    G>очевидно, проверять ровно так же как и в любом другом языке. Никакая типизация и никакой язык программирования не поможет тебе если ты неправильно перенес логику из требований в код. Непонятно почему у тебя вообще возник такой вопрос.

    Он у меня не возник, он просто есть Я вот все жду ответа


    dmitriid.comGitHubLinkedIn
    Re[78]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 02.03.15 12:42
    Оценка:
    G>Ну кстати это не аргумент. Может конкретно в вашей системе огромное количество денег, сил и времени тратится на написание тестов, которые можно было б не тратить в статических языках?

    G>Иными словами это всего-лишь один пример, а надо говорить про статистику.


    Ну, статистика, емнип, говорит, что ошибки типизации — в меньшинстве. Найте не найду, потому что гугл в последнее время мне не поддается


    dmitriid.comGitHubLinkedIn
    Re[79]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 02.03.15 13:15
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>Ну, статистика, емнип, говорит, что ошибки типизации — в меньшинстве. Найте не найду, потому что гугл в последнее время мне не поддается


    на фоне ошибок в бизнес-логике скорее всего в меньшинстве. Поэтому никто и не заморачивается со сложной типизацией
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 02.03.15 19:00
    Оценка: 19 (1) +1
    Здравствуйте, Mamut, Вы писали:

    M>Нууу... Сложно сказать. Из того, что я пока видел из предложенного в двух ветках, там на каждое условие придется писать свой тип/параметр типа, которые в некоторых местах вообще непонятно, как будут выглядеть (см. последнюю строчку).

    Последняя строчка выглядит так, что она как раз останется частью рантайм-функциональности. Т.е. задача не сводится к тому, чтобы математически доказать, что подобных условий в принципе возникнуть не может. Они могут возникнуть, и штатной функциональностью будет отказ от выполнения операции с возвратом рантайм-ошибки.
    А в остальном — да, на каждое статически проверяемое условие будет свой параметр типа.
    Это как бы не такая уж проблема в смысле объёма требований. Это в С++ или С# реализация может оказаться крайне громоздкой, а некоторые вещи вообще не взлетят (ну там, где параметр типа не Boolean, а что-то поинтереснее).


    M>Если это — камень в мой огород, то это не я, честно-честно Я прекрасно понимаю, когда мне говорят, что типы помогают не складывать апельсины с крокодилами и помогают при рефакторинге

    Не совсем в твой огород. В твой огород — камень про то, что ты периодически передёргиваешь в сторону того, что типы должны вообще всё-всё "за тебя" делать.
    Вот как раз этого никто не обещал.
    Мне нравится сама тема разговора — попытка скрестить "матан" передовиков типизации с "сермягой" прикладных направлений.
    И коммуникационные проблемы тут вполне ожидаемы — теоретики не очень внятно представляют себе, что такое обработка заказа, а практики не очень понимают, чего вообще ожидать от типизации в частности и статической верификации контрактов вообще.

    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 03.03.15 10:30
    Оценка: :)
    Здравствуйте, Mamut, Вы писали:

    M>Может и есть, но пока что практически ни один из пропонентов не смог ни внятно объяснить принцип, ни показать пример сложнее «hello, world». Тут или проблема в том, что все это — сугубо теоретизирование, либо добровольное заблуждение (с ООП тоже что-то похожее было).


    Я тебе ответил в той темке: http://rsdn.ru/forum/philosophy/5971692.1
    Автор: alex_public
    Дата: 03.03.15


    P.S. Да, а Хаскель всё равно не нужен.
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 03.03.15 16:27
    Оценка:
    Здравствуйте, alex_public, Вы писали:

    _>Здравствуйте, Mamut, Вы писали:


    M>>Может и есть, но пока что практически ни один из пропонентов не смог ни внятно объяснить принцип, ни показать пример сложнее «hello, world». Тут или проблема в том, что все это — сугубо теоретизирование, либо добровольное заблуждение (с ООП тоже что-то похожее было).


    _>Я тебе ответил в той темке: http://rsdn.ru/forum/philosophy/5971692.1
    Автор: alex_public
    Дата: 03.03.15


    Ответ тебе будет очень простой (выделено выше)
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 03.03.15 16:36
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, Mamut, Вы писали:


    M>>Нууу... Сложно сказать. Из того, что я пока видел из предложенного в двух ветках, там на каждое условие придется писать свой тип/параметр типа, которые в некоторых местах вообще непонятно, как будут выглядеть (см. последнюю строчку).

    S>Последняя строчка выглядит так, что она как раз останется частью рантайм-функциональности. Т.е. задача не сводится к тому, чтобы математически доказать, что подобных условий в принципе возникнуть не может. Они могут возникнуть, и штатной функциональностью будет отказ от выполнения операции с возвратом рантайм-ошибки.
    S>А в остальном — да, на каждое статически проверяемое условие будет свой параметр типа.

    бинго

    S>Это как бы не такая уж проблема в смысле объёма требований. Это в С++ или С# реализация может оказаться крайне громоздкой, а некоторые вещи вообще не взлетят (ну там, где параметр типа не Boolean, а что-то поинтереснее).

    Все, что может быть выражено цепочкой if/else — будет работать. Каким бы сложным ни было свойство — ты всегда можешь сделать функцию по его проверке, которая будет возвращать bool — прошла проверка или нет. Свойство не обязано быть булевским само по себе. Скажем, цена заказа — это не булевское свойство. А вот превышает ли она литим, гарантирующий бесплатную доставку — это да/нет.
    Или, в моем же примере, есть свойство "можно ли для этого ордера (в его нынешнем состоянии) поднять цену на данную величину". Это уже свойство, объединяющее несколько сущностей и выражающее отношения между ними.

    Булевское свойство просто делается проще всего, поэтому я его реализовал напрямую в своем примере. Это не значит, что только булевские свойства возможны.

    S>Мне нравится сама тема разговора — попытка скрестить "матан" передовиков типизации с "сермягой" прикладных направлений.

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

    Вот я — практик до не знаю мозга каких костей, я вообще не программер по образованию И по банкам работаю уже лет 15, так что про ордера (биржевые, правда) я знаю все
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[69]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 03.03.15 16:41
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, AlexRK, Вы писали:


    ARK>>Чем вам не нравится пост jazzer'a? http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15

    S>Тем, что там нету Load, зато есть runtime-проверки.

    PROF_IF — это рантайм-проверка и есть.

    ARK>>Видите там boost::enable_if? Функция increase_amount определена только в контексте, где на ее аргумент навешено требуемое свойство. C# такими шаблонными возможностями не обладает.

    S>Дело не в C#. Дело в том, что jazzer приписывает своему коду свойства, которых там и в помине нет. И вы его зачем-то поддерживаете

    Какие именно?

    ЗЫ Мне вообще удивительно, в одних постах ты пишешь так, что выглядит, будто ты все понял (правда, эти посты обычно Мамуту адресованы), а в других, типа этого — как будто все мимо. Как будто два разных человека пишут.

    ЗЗЫ Сайту ощутимо не хватает фичи "упоминаний". В смысле, если где-то твой ник упомянули — ты мог прийти и отписаться. А то я чудом на этот пост попал.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.03.15 05:40
    Оценка:
    M>>>Может и есть, но пока что практически ни один из пропонентов не смог ни внятно объяснить принцип, ни показать пример сложнее «hello, world». Тут или проблема в том, что все это — сугубо теоретизирование, либо добровольное заблуждение (с ООП тоже что-то похожее было).

    _>>Я тебе ответил в той темке: http://rsdn.ru/forum/philosophy/5971692.1
    Автор: alex_public
    Дата: 03.03.15


    J>Ответ тебе будет очень простой (выделено выше)


    Ну, ты почти прав. Всю задачу в итоге так никто и не осилил, все сдуваются после первого шага, предпочитая отмазываться «дальше и так все понятно». Уж не знаю, почему


    dmitriid.comGitHubLinkedIn
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 04.03.15 06:55
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ну, ты почти прав. Всю задачу в итоге так никто и не осилил, все сдуваются после первого шага, предпочитая отмазываться «дальше и так все понятно». Уж не знаю, почему


    Наверное, потому что дальше и так все понятно?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[77]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.03.15 07:23
    Оценка:
    M>>Ну, ты почти прав. Всю задачу в итоге так никто и не осилил, все сдуваются после первого шага, предпочитая отмазываться «дальше и так все понятно». Уж не знаю, почему

    J>Наверное, потому что дальше и так все понятно?


    Автору сообщения? Может быть.


    dmitriid.comGitHubLinkedIn
    Re[78]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 04.03.15 07:43
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>>>Ну, ты почти прав. Всю задачу в итоге так никто и не осилил, все сдуваются после первого шага, предпочитая отмазываться «дальше и так все понятно». Уж не знаю, почему


    J>>Наверное, потому что дальше и так все понятно?


    M>Автору сообщения? Может быть.


    А что _конкретно_ непонятно тебе?
    Как проверить очередное свойство? Так это, вроде, очевидно.
    Как быть, если свойств становится слишком много (если свойство, которое мы хотим гарантировать, слишком сложное, и запаришься выписывать индивидуальные свойства, его составляющие)? Так про это тоже есть в статье, читай после слов "Надеюсь, идея понятна".
    Еще что-то?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[79]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.03.15 08:15
    Оценка:
    M>>Автору сообщения? Может быть.

    J>А что _конкретно_ непонятно тебе?

    J>Как проверить очередное свойство? Так это, вроде, очевидно.
    J>Как быть, если свойств становится слишком много (если свойство, которое мы хотим гарантировать, слишком сложное, и запаришься выписывать индивидуальные свойства, его составляющие)? Так про это тоже есть в статье, читай после слов "Надеюсь, идея понятна".
    J>Еще что-то?

    Можно вместо тонны слов и «статьи, после слов надеюсь понятно» показать как это будет в коде?

    Потому что написать «Надеюсь, идея понятна. Дополнительные требования навешиваются аналогично. Если элементарных свойств/требований становится слишком много, то можно их просто упаковать в мета-свойство IncreaseAmountOK» легко. Но почему-то никто так и не осилил больше одного шага

    Я хочу увидеть это «метасвойство». Я хочу увидеть, как решается заявленное тобой «типы помогают при ad-hoc дизайне», ведь именно для этого в моей задаче три шага.

    Я хочу увидеть, что да, действительно, после реализации «метасвойства», после которого «таким образом мы вернемся к простому первоначальному варианту», мы действительно вернемся к простому варианту, после которого можно будет действительно сказать, что «не сказать, что кода стало на 100500 порядков больше». Потому что тут где-то рядом Sinclair задал наводящий вопрос, и внезапно надо было прописывать еще дополнительные prop_if'ы.

    Потому что мне действительно хочется увидеть полное решение моей задачи, в котором используются все громогласные заявления, начиная отсюда
    Автор: Klapaucius
    Дата: 03.02.15
    . Этот вопрос я уже задавал, но задам еще раз: почему все приводят короткие, неполные решения с заявлением «ну, дальше все понятно» и не могут осилить одно полное решение? Но после этого я должен поверить, что это все круто будет работать для гораздо более разветвленной
    Автор: Mamut
    Дата: 06.02.15
    реальности?

    Хех. Кстати. Перечитал свои условия для шага 1, и понял, что у тебя не реализован даже шаг 1

    Я умолчу о том, что все, как огня избегают отвечать на вопрос, а как все это тестировать Но это отдельный вопрос (хотя он и был, по сути, в самом
    Автор: Mamut
    Дата: 03.02.15
    начале
    Автор: Mamut
    Дата: 03.02.15
    нашего уютного срачика).


    dmitriid.comGitHubLinkedIn
    Re[80]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 04.03.15 08:39
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>>>Автору сообщения? Может быть.


    J>>А что _конкретно_ непонятно тебе?

    J>>Как проверить очередное свойство? Так это, вроде, очевидно.
    J>>Как быть, если свойств становится слишком много (если свойство, которое мы хотим гарантировать, слишком сложное, и запаришься выписывать индивидуальные свойства, его составляющие)? Так про это тоже есть в статье, читай после слов "Надеюсь, идея понятна".
    J>>Еще что-то?

    M>Можно вместо тонны слов и «статьи, после слов надеюсь понятно» показать как это будет в коде?


    имей совесть. Там есть пример кода, прямо в статье. Ты почему-то делаешь вид, что его там нет. Наверное, ты просто перепутал форум и решил, что мы в КСВ.
    Попробуй все же прочитать и осмыслить то, что написано в статье, не бросаясь отвечать на уровне коленного рефлекса.

    M>Потому что написать «Надеюсь, идея понятна. Дополнительные требования навешиваются аналогично. Если элементарных свойств/требований становится слишком много, то можно их просто упаковать в мета-свойство IncreaseAmountOK» легко. Но почему-то никто так и не осилил больше одного шага

    Там есть пример кода, прямо в статье.

    M>Я хочу увидеть это «метасвойство». Я хочу увидеть, как решается заявленное тобой «типы помогают при ad-hoc дизайне», ведь именно для этого в моей задаче три шага.

    просто добавляешь дополнительные проверки внутри can_increase_amount.

    M>Я хочу увидеть, что да, действительно, после реализации «метасвойства», после которого «таким образом мы вернемся к простому первоначальному варианту», мы действительно вернемся к простому варианту, после которого можно будет действительно сказать, что «не сказать, что кода стало на 100500 порядков больше». Потому что тут где-то рядом Sinclair задал наводящий вопрос, и внезапно надо было прописывать еще дополнительные prop_if'ы.

    Там есть пример кода, прямо в статье.

    M>Потому что мне действительно хочется увидеть полное решение моей задачи, в котором используются все громогласные заявления, начиная отсюда
    Автор: Klapaucius
    Дата: 03.02.15
    . Этот вопрос я уже задавал, но задам еще раз: почему все приводят короткие, неполные решения с заявлением «ну, дальше все понятно» и не могут осилить одно полное решение? Но после этого я должен поверить, что это все круто будет работать для гораздо более разветвленной
    Автор: Mamut
    Дата: 06.02.15
    реальности?

    просто добавляешь дополнительные проверки внутри can_increase_amount.

    M>Хех. Кстати. Перечитал свои условия для шага 1, и понял, что у тебя не реализован даже шаг 1


    M>Я умолчу о том, что все, как огня избегают отвечать на вопрос, а как все это тестировать


    А как ты тестируешь, что у тебя в int i действительно int, а не строка? Ответ — никак. Это невозможно (если только ты не расстреливаешь память или в компиляторе не водятся баги), и тестировать это смысла нет.

    M>Но это отдельный вопрос (хотя он и был, по сути, в самом
    Автор: Mamut
    Дата: 03.02.15
    начале
    Автор: Mamut
    Дата: 03.02.15
    нашего уютного срачика).


    Срачик у тебя получилось создать, спору нет, тут ты мастер.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 04.03.15 08:39
    Оценка:
    Здравствуйте, jazzer, Вы писали:


    J>Булевское свойство просто делается проще всего, поэтому я его реализовал напрямую в своем примере. Это не значит, что только булевские свойства возможны.

    J>Вот я — практик до не знаю мозга каких костей, я вообще не программер по образованию И по банкам работаю уже лет 15, так что про ордера (биржевые, правда) я знаю все
    Ну вот тем не менее мы так и не увидели примера кода, в котором
    а) есть загрузка ордера из базы
    б) нет функции обработки, которая бросает runtime ошибку для "статически-верифицируемых" свойств.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 04.03.15 09:07
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>PROF_IF — это рантайм-проверка и есть.

    Вот именно. Т.е. мы так никуда и не ушли от рантайм-проверок. А значит, всё, что мы делаем в рантайме — бесполезно.
    Это как иметь нормальные numeric типы в выражениях, но все переменные имеют тип object. И мы каждый раз приводим: object a = (int)b*(int)c.

    J>Какие именно?

    Компайл-тайм верификацию корректности кода и отсуствие "неожиданных сообщений об ошибках".

    J>ЗЫ Мне вообще удивительно, в одних постах ты пишешь так, что выглядит, будто ты все понял (правда, эти посты обычно Мамуту адресованы), а в других, типа этого — как будто все мимо.

    Это оттого, что вместо ответов на вопросы вы пытаетесь угадать, "понял" я или нет.
    Дело не в этом. Я "теоретическую" часть понимаю не хуже вас с ARK. Я задаю совершенно конкретные вопросы, которых вы избегаете. Или начинаете нести откровенный бред, утверждая, к примеру, что MessageBox показанный изнутри increase_amount чем-то хуже, чем такой же MessageBox, показанный изнутри try_increasing_amount().
    Ну, то есть может быть это и не бред, но в инженерной дискуссии принято обосновывать утверждения, а не просто говорить "вот этого MessageBox пользователь ожидает, а этого — нет!".

    J>ЗЗЫ Сайту ощутимо не хватает фичи "упоминаний". В смысле, если где-то твой ник упомянули — ты мог прийти и отписаться. А то я чудом на этот пост попал.

    Это совершенно необязательно — я отвечаю на все ваши реплики, стоящие того. И если я где-то пишу, что вы мне не ответили — значит, вы не ответили мне на пост, в котором я отвечал вам.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 04.03.15 09:21
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Ну вот тем не менее мы так и не увидели примера кода, в котором

    S>а) есть загрузка ордера из базы

    Ты издеваешься, что ли? Я ведь уже отвечал на этот вопрос. Считай, что ордер в моей статье пришел из базы. Или тебе SQL нужен?

    S>б) нет функции обработки, которая бросает runtime ошибку для "статически-верифицируемых" свойств.


    Нет никаких "статически-верифицируемых" свойств (хотя хз, что ты под этим имеешь в виду, конечно). Есть гарантии со стороны компилятора, что определенные функции могут быть позваны только в определенных местах кода, и эти места определяются рантайм-свойствами. Всё. А обработка рантайм-ошибок точно такая же, как всегда — исключения, коды ошибок и прочая, тут вообще ничего не меняется.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 04.03.15 09:36
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>Я же показал, чем тебя не устраивает try_to_change_amount?

    S>Вы что, шутите?
    S>Ок, давайте внимательно посмотрим на ваш try_to_change_amount:
    S>
    S>void try_to_change_amount(Order& o)
    S>{
    S>  PROP_IF(o, has_risk(o), HasRisk) { // что это мы тут имеем? А! Это же... РАНТАЙМ ПРОВЕРКА!!! Которых у вас якобы нету!
    
    можно пальцем показать, где я говорил, что их нету? когда в моем же примере кода они есть? :???:
    
    S>    // а тут??? Мы что, тупо проигнорировали команду - и типа делаем вид, что всё нормально??? 
    S>    // на самом деле тут, конечно же, будет throw - потому что ничего больше сделать нельзя.
    
    конечно же, тут будет throw :xz: Или msg box :xz: Или сообщение по сети :xz:
    я разве где-то говорил, что этого не будет :???:
    
    S>  }
    S>  PROP_ELSE(o) {
    S>    increase_amount(o, 2.71);
    S>  };
    S>}
    S>

    J>>Где она падает, сорри? У меня такое чувство, что мы говорим о разных вещах.
    S>См. код выше. Вы ловко замели проблему "попытка увеличить amount для рискового ордера" под ковёр, ничего не скажешь. Просто сделаем вид, что такой попытки не было.

    S>Вашему двухслойному коду вполне эквивалентен вот такой:

    S>
    S>increase_amount(Order& o, Money amt)
    S>{
    S>  if(o.HasRisk)
    S>  {  // doing nothing 
    S>  }
    S>  else
    S>  {
    S>    o.Amount += amt;
    S>  }
    S>}
    S>


    Он не эквивалентен в смысле возможности написать ошибочный код. У тебя увеличить amount по ошибке можно в обоих етках и вообще за пределами ифа. У меня нет. Именно в этом разница.
    Блин, ну ты же сам писал: "Код, содержащий незаконный переход, просто не скомпилируется."
    Вот что в твоем коде может быть:
    S>
    S>increase_amount(Order& o, Money amt)
    S>{
        o.Amount += amt; // незаконно! но компилируется!
    S>  if(o.HasRisk)
    S>  {  // doing nothing 
          o.Amount += amt; // незаконно! но компилируется!
    S>  }
    S>  else
    S>  {
    S>    o.Amount += amt;
    S>  }
        o.Amount += amt; // незаконно! но компилируется!
    S>}
    S>

    А в моем всего этого быть не может в принципе.
    Потому что, как ты правильно выразился, у меня код двухслойный: есть слой функций, выполняющих реальные действия (типа increase_amount), есть слой функций бизнес-логики (типа try_to_change_amount), которые зовут функции реального слоя. Так вот код функций слоя бизнес-логики в моем случае может быть написан только по определенным правилам, задаваемым свойствами, отображаемыми в типы. Его нельзя написать произвольно, просто от балды накидав вызовов функций реального слоя.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 04.03.15 11:05
    Оценка: 3 (1)
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>PROF_IF — это рантайм-проверка и есть.

    S>Вот именно. Т.е. мы так никуда и не ушли от рантайм-проверок.
    Я где-то говорил, что мы от них ушли?

    S>А значит, всё, что мы делаем в рантайме — бесполезно.

    Не понял.

    S>Это как иметь нормальные numeric типы в выражениях, но все переменные имеют тип object. И мы каждый раз приводим: object a = (int)b*(int)c.

    Нет, не так.
    Твой код:
    object operator*(object a, object b)
    {
      if (type(a)!=int) throw "первый параметр в сложении плохой";
      if (type(b)!=int) throw "второй параметр в сложении плохой";
      return (int)a * (int)b;
    }
    
    operator=(object a, object b)
    {
      if (type(a)!=int) throw "первый параметр в присваивании плохой";
      if (type(b)!=int) throw "второй параметр в присваивании плохой";
      (int)a = (int)b;
    }
    
    f(object a, object b, object c) {
      a=b*c; // красота, всё чистенько
    }

    мой код:
    int operator*(int a, int b)
    {
      return a*b;
    }
    operator=(int a, int b)
    {
      return a=b;
    }
    
    f(object a, object b, object c) {
      if (type(a)!=int) throw "По сети пришла фигня";
      int ia = (int)a;
      if (type(b)!=int) throw "Вы в поле в форме ввели фигню";
      int ib = (int)b;
      if (type(c)!=int) throw "В файле лежит фигня";
      int ic = (int)c;
    
      // дальше исключений не будет
      ia = ib*ic;
    }

    на первый взгляд — шило на мыло (хотя уже видна разница), но стоит написать функцию f посложнее (ну там добавить остальные операторы, добавить еще пару параметров других типов) — и разница сразу вылезет наружу: у меня все проверится один раз и дальше будет работа с типизированными объектами (и типизацию сможет проверить компилятор, и в типизированном коде уже не будет никаких исключений), а у тебя все будет проверяться каждый раз (тупо лишняя работа) и исключения будут вылетать из глубины операторов, а не из функции бизнес-логики f. Плюс у меня эти исключения будут осмысленными, так как они на уровне бизнес-логики генерятся и имеют бизнес-смысл (типа "вы вот тут ввели строчку, а надо число"), а у тебя будет просто "не могу сложить вот это и вот это" — при том что пользователь может и понятия не иметь, что там что-то где-то в недрах складывается, и уж тем более не будет знать, что за "вот это" имеется в виду.

    J>>Какие именно?

    S>Компайл-тайм верификацию корректности кода и отсуствие "неожиданных сообщений об ошибках".

    J>>ЗЫ Мне вообще удивительно, в одних постах ты пишешь так, что выглядит, будто ты все понял (правда, эти посты обычно Мамуту адресованы), а в других, типа этого — как будто все мимо.

    S>Это оттого, что вместо ответов на вопросы вы пытаетесь угадать, "понял" я или нет.
    S>Дело не в этом. Я "теоретическую" часть понимаю не хуже вас с ARK. Я задаю совершенно конкретные вопросы, которых вы избегаете. Или начинаете нести откровенный бред, утверждая, к примеру, что MessageBox показанный изнутри increase_amount чем-то хуже, чем такой же MessageBox, показанный изнутри try_increasing_amount().
    ??? Это ты о чем?

    S>Ну, то есть может быть это и не бред, но в инженерной дискуссии принято обосновывать утверждения, а не просто говорить "вот этого MessageBox пользователь ожидает, а этого — нет!".

    Ты точно со мной разговариваешь?

    J>>ЗЗЫ Сайту ощутимо не хватает фичи "упоминаний". В смысле, если где-то твой ник упомянули — ты мог прийти и отписаться. А то я чудом на этот пост попал.

    S>Это совершенно необязательно — я отвечаю на все ваши реплики, стоящие того. И если я где-то пишу, что вы мне не ответили — значит, вы не ответили мне на пост, в котором я отвечал вам.
    Тем не менее, я хотел бы, чтобы было упоминание о посте, в котором меня склоняют без моего ведома. Чтоб я мог хотя бы зашититься, если там вдруг обвинят меня в том, чего я не говорил.

    ЗЫ А почему вдруг на вы, если не секрет?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[81]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.03.15 14:03
    Оценка:
    M>>Можно вместо тонны слов и «статьи, после слов надеюсь понятно» показать как это будет в коде?

    J>имей совесть. Там есть пример кода, прямо в статье. Ты почему-то делаешь вид, что его там нет. Наверное, ты просто перепутал форум и решил, что мы в КСВ.


    Незаконченный код, который даже не описывает «шаг 1» из моей задачи, заканчивающийся на «ну дальше все понятно, потом делаем метасвойство».


    M>>Потому что написать «Надеюсь, идея понятна. Дополнительные требования навешиваются аналогично. Если элементарных свойств/требований становится слишком много, то можно их просто упаковать в мета-свойство IncreaseAmountOK» легко. Но почему-то никто так и не осилил больше одного шага

    J>Там есть пример кода, прямо в статье.

    Покажи мне, где там пример кода мета-свойства IncreaseAmountOK, и как его использовать.

    Покажи мне пошагово, как и где твой код, реализующий шаг 1 легким движением руки превращается в код, реализующий шаг два (напомню: именно ты говорил о том, что типы позволяют легко справляться с ad-hoc изменениями). Почему у тебя все заканчивается строго и исключительно на «там дальше просто/очевидно/поянтно»?

    Вот мне не просто, не очевидно и не понятно Поэтому я прошу, чтобы мне показали что-нибудь более полное, чем незаконченный код, который «ну дальше очевидно»

    M>>Я хочу увидеть это «метасвойство». Я хочу увидеть, как решается заявленное тобой «типы помогают при ad-hoc дизайне», ведь именно для этого в моей задаче три шага.

    J>просто добавляешь дополнительные проверки внутри can_increase_amount.

    Добавь, пожалуйста. Я же не просто так прошу привести пример законченного решения

    M>>Потому что мне действительно хочется увидеть полное решение моей задачи, в котором используются все громогласные заявления, начиная отсюда
    Автор: Klapaucius
    Дата: 03.02.15
    . Этот вопрос я уже задавал, но задам еще раз: почему все приводят короткие, неполные решения с заявлением «ну, дальше все понятно» и не могут осилить одно полное решение? Но после этого я должен поверить, что это все круто будет работать для гораздо более разветвленной
    Автор: Mamut
    Дата: 06.02.15
    реальности?

    J>просто добавляешь дополнительные проверки внутри can_increase_amount.

    Добавь, пожалуйста. Я же не просто так прошу привести пример законченного решения

    Почему никто не хочет привести полный код решения этого самого «просто добавь проверки»?

    M>>Хех. Кстати. Перечитал свои условия для шага 1, и понял, что у тебя не реализован даже шаг 1

    M>>Я умолчу о том, что все, как огня избегают отвечать на вопрос, а как все это тестировать

    J>А как ты тестируешь, что у тебя в int i действительно int, а не строка? Ответ — никак. Это невозможно (если только ты не расстреливаешь память или в компиляторе не водятся баги), и тестировать это смысла нет.


    Это не ответ на мой вопрос, а уход от вопроса.

    M>>Но это отдельный вопрос (хотя он и был, по сути, в самом
    Автор: Mamut
    Дата: 03.02.15
    начале
    Автор: Mamut
    Дата: 03.02.15
    нашего уютного срачика).


    J>Срачик у тебя получилось создать, спору нет, тут ты мастер.


    Срачик создали вы сами


    dmitriid.comGitHubLinkedIn
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 04.03.15 14:07
    Оценка:
    J>будет проверяться каждый раз (тупо лишняя работа) и исключения будут вылетать из глубины операторов, а не из функции бизнес-логики f. Плюс у меня эти исключения будут осмысленными, так как они на уровне бизнес-логики генерятся и имеют бизнес-смысл (типа "вы вот тут ввели строчку, а надо число"), а у тебя будет просто "не могу сложить вот это и вот это" — при том что пользователь может и понятия не иметь, что там что-то где-то в недрах складывается, и уж тем более не будет знать, что за "вот это" имеется в виду.


    Уже второй, как минимум, раз ты генеришь эту бредятину об ошибках. Откуда ты ее выкопал — хз.

    Вот у нас в насквозь динамическом коде генерятся осмысленные исключения, которые имеют бизнес-смысл. Мы, видать, что-то невозможное с твоей точки зрения делаем


    dmitriid.comGitHubLinkedIn
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 04.03.15 15:51
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Ну вот тем не менее мы так и не увидели примера кода, в котором

    S>а) есть загрузка ордера из базы
    S>б) нет функции обработки, которая бросает runtime ошибку для "статически-верифицируемых" свойств.

    А чем тебе этот http://rsdn.ru/forum/philosophy/5971692.1
    Автор: alex_public
    Дата: 03.03.15
    пример не подходит? ) Там не просто есть обе требуемые тобой вещи, но это даже полный компилируемый код. )))
    Re[81]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 04.03.15 23:22
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    EP>1. Y может использоваться из разных мест.

    EP>2. В разных контекстах проверки могут иметь разную форму, работать с разными наборами данных, хотя по сути будут проверять одно и тоже свойстов/предусловие. И далеко не все эти проверки можно собрать в одной функции X.
    EP>3. Далеко не всегда проверки можно вызывать несколько раз подряд — это может поломать инварианты/постусловия. Чтобы вызывать Y несколько раз, придётся вызывать несколько раз X, что приведёт к повторным проверкам.
    EP>4. И наконец, далеко не всегда предусловия можно проверить — даже однократная проверка может поломать инварианты/постусловия, либо вообще может быть невозможна физически.
    M>Может. Возможно. Может. Возможно. Это мы уже проходили
    Автор: Mamut
    Дата: 26.02.15
    :


    Тебя удивляет наличие условий для целесообразного применения какой-то техники?

    M>Ты все равно не отвечаешь на простой вопрос: в чем принципиальная разница между лапшой, в которой типы так прекрасно помогают, и рефакторингом, в котором все эти «предусловия» без изменений просто переносятся в одну функцию.


    В очередной раз: в том что ранее недопустимое значение, стало вполне штатным режимом работы.

    EP>>>>Как-то: вместо безликих amount'ов введи тип MoneyUSD или что там у вас

    M>>>1. Нахер надо?
    EP>>Догадайся:
    EP>>

    M>Я предлагаю хотя бы как-то

    M>Я догадался: шобы було. Просто шобы було.

    И?

    EP>>>Я не говорил что обогащать типами можно любую задачу до бесконечности.
    M>>Я не предлагаю до бесконечности. Я предлагаю хотя бы как-то. Но даже как-то у вас или не рожается или рожается со скрипом и пинками

    Ты предложил "как-то", я показал — что не устраивает?

    EP>>Например предотвратит передачу MoneyAUD в MoneyUSD, или например радикально сократит количество перестановок аргументов валидных с точки зрения типов

    M>Опять сплошная демагогия. У нас в насквозь динамической системе нет радикального количества перестановок аргументов

    Есть:
    void foo(X, X, X, X);
    // ...
    foo(a, b, c, d);
    Код скомпилируется с любой из 24 перестановок аргументов a,b,c,d. А для
    void bar(X, X, X, Y);
    // ...
    bar(a, b, c, d);
    есть только 6 перестановок аргументов которые скомпилируются.

    M>>>>>Передаем проверку на отсортированность/сортировку в одно место — и оппа «это становится бессмысленно» ©™

    EP>>>>Каким образом? Типа assert(x is Sorted)? Так я об этом уже говорил:
    M>>>Вау. Каким образом в стат. типизации будет проверено, что массив отсортированный? Магическим способом и святым духом?
    EP>>Sorted это тип.
    M>И что? Перечитай еще раз выделенное. Я просто использую твою логику. Убираем «предусловия». Переносим проверку в одну функцию, и все «это становится бессмысленно» ©

    Ещё раз уточняю, какую конкретно проверку? assert(x is SortedTYPE) или assert(check_sorted(x))(то есть линейная проверка на отсортированность)?

    EP>>Но какие из преимуществ динамического языка тогда останутся?

    M>Вопрос должен быть поставлен наоборот: какие из преимуществ стат. языка останутся?

    Почему наоборот-то? Ты предлагаешь в динамическом языке делать все runtime проверки, которые в статическом языке делаются в compile-time. При этом у тебя даже нет гарантии что эти runtime проверки поймают баг во время unit-test'ов.
    То есть ты потратил сравнимые усилия (я бы сказал даже большие), получив при этом меньший результат, при этом потеряв скорость разработки (которую часто называют одним из главных плюсов динамических языков).
    Ещё раз, какие из преимуществ динамического языка тогда останутся?

    M>>>Потому что даже отсутсвие такого инструмента приводит к двум ошибкам в год.

    EP>>Найденным?
    M>А только они имеют смысл Я же говорю вы все — сугубые теортетики. Не найденные нас не интересуют, от слова «вообще».

    То есть вас интересуют только те баги которые вы нашли, и совсем не интересуют те которые ещё остались? Жесть какая-то

    M>Нас гораздо больше интересует бизнес-логика. Но в ней, мы уже выяснили, стат. типизация не помогает, от слова вообще.


    Что ты понимаешь под бизнес логикой? Баг с единицами измерения в Mars Climate Orbiter — это бизнес логика?
    Прямое списание AUD со счёта USD — это бизнес логика?

    EP>>И что? На динамическом языке можно написать корректную и надёжную программу, и наоборот — на статическом некорректную и ненадёжную

    M>Нет. И на том и на другом языке можно напичать как надежную, так и ненадежную систему. Пока что ни ты, ни один из твоих оппонентов не показал, каким образом стат. типизация прямо таки мега помогает писать надежные системы.

    Что ты вкладываешь в понятие "мега помогает"?

    M>Любые наводящие вопросы растворяются в словоблудии и наборе все более абсурдных условий, в которых она (якобы) помогает.


    Переход на хамство в ответ на терпеливые объяснения — бывает и такое на RSDN
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 05.03.15 04:31
    Оценка: 32 (1)
    Здравствуйте, jazzer, Вы писали:

    J>Ты издеваешься, что ли? Я ведь уже отвечал на этот вопрос. Считай, что ордер в моей статье пришел из базы. Или тебе SQL нужен?

    Меня просто не устраивает ваш ответ

    S>>б) нет функции обработки, которая бросает runtime ошибку для "статически-верифицируемых" свойств.


    J>Нет никаких "статически-верифицируемых" свойств (хотя хз, что ты под этим имеешь в виду, конечно). Есть гарантии со стороны компилятора, что определенные функции могут быть позваны только в определенных местах кода, и эти места определяются рантайм-свойствами. Всё. А обработка рантайм-ошибок точно такая же, как всегда — исключения, коды ошибок и прочая, тут вообще ничего не меняется.


    Ключевое выделено. Ещё раз объясню простую вещь, которая до вас никак не хочет дойти: вы написали в два с половиной раза больше кода, при этом не совершив никакой полезной работы.
    Количество рантайм проверок — такое же; устойчивость кода к ошибкам программиста — такая же.
    Ну так если нету разницы, то зачем платить больше?

    Вы поймите, тех функций, которые у вас "можно позвать только в определённых местах кода", в безтиповом коде нету вообще. Вы сумели "побороть" только проблему, которую сами же и создали.

    Это не говоря о том, что ограничить места, из которых можно позвать определённые функции, можно гораздо более простым способом — например, сделав их приватными и перечислив исключения во friend-декларации
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 05.03.15 04:44
    Оценка: +1
    Здравствуйте, jazzer, Вы писали:

    J>Он не эквивалентен в смысле возможности написать ошибочный код.

    Ну конечно же эквивалентен.

    J>У тебя увеличить amount по ошибке можно в обоих етках и вообще за пределами ифа. У меня нет. Именно в этом разница.

    Можно. И у вас — тоже можно, только на уровень выше.
    Вы заменяете код вида var a = 5/b на код вида if (b==0) throw new DivisionByZeroException() else a =5/b;.

    J>Блин, ну ты же сам писал: "Код, содержащий незаконный переход, просто не скомпилируется."

    J>Вот что в твоем коде может быть:
    S>>
    S>>increase_amount(Order& o, Money amt)
    S>>{
    J>    o.Amount += amt; // незаконно! но компилируется!
    S>>  if(o.HasRisk)
    S>>  {  // doing nothing 
    J>      o.Amount += amt; // незаконно! но компилируется!
    S>>  }
    S>>  else
    S>>  {
    S>>    o.Amount += amt;
    S>>  }
    J>    o.Amount += amt; // незаконно! но компилируется!
    S>>}
    S>>

    J>А в моем всего этого быть не может в принципе.
    Омг. Ну и что?

    J>Потому что, как ты правильно выразился, у меня код двухслойный: есть слой функций, выполняющих реальные действия (типа increase_amount), есть слой функций бизнес-логики (типа try_to_change_amount), которые зовут функции реального слоя. Так вот код функций слоя бизнес-логики в моем случае может быть написан только по определенным правилам, задаваемым свойствами, отображаемыми в типы. Его нельзя написать произвольно, просто от балды накидав вызовов функций реального слоя.

    Вы неправильно понимаете результат собственных действий.
    Вот у вас есть слой "небезопасных" функций — тех, которые нельзя вызывать с произвольными агументами. Допустим, например, что можно нечаянно получить ордер с отрицательной суммой.
    Чтобы защитить эти "голые" функции, вы оборачиваете их в функции, которые выполняют рантайм-проверку аргументов перед вызовом. А "голые" функции вы прячете путём описания требований к аргументам в сигнатуре.
    Победа?
    Нет. Я точно так же могу ошибочно вызвать функцию-оболочку откуда угодно, и компилятор прекрасно пропустит эту заведомую ошибку.
    Считайте, что коду "бизнес-логики" видны только нетипизированные функции-оболочки. Он внезапно окажется точно таким же, как и в исходном нетипизированном варианте.
    Только внутри написано чуть больше кода для предотвращения "ошибок", которых в исходном коде не было вовсе.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 05.03.15 05:08
    Оценка: 36 (1)
    Здравствуйте, jazzer, Вы писали:
    S>>Вот именно. Т.е. мы так никуда и не ушли от рантайм-проверок.
    J>Я где-то говорил, что мы от них ушли?
    Вроде нет, но без этого ухода теряется весь смысл статической верификации.
    J>Не понял.
    Сейчас разберёмся.
    J>на первый взгляд — шило на мыло (хотя уже видна разница),
    Да, совершенно верно.

    J>но стоит написать функцию f посложнее — и разница сразу вылезет наружу: у меня все проверится один раз и дальше будет работа с типизированными объектами (и типизацию сможет проверить компилятор, и в типизированном коде уже не будет никаких исключений), а у тебя все будет проверяться каждый раз (тупо лишняя работа) и исключения будут вылетать из глубины операторов, а не из функции бизнес-логики f.

    Воот. Теперь мы наконец говорим на нужную тему.

    J>Плюс у меня эти исключения будут осмысленными, так как они на уровне бизнес-логики генерятся и имеют бизнес-смысл (типа "вы вот тут ввели строчку, а надо число"), а у тебя будет просто "не могу сложить вот это и вот это" — при том что пользователь может и понятия не иметь, что там что-то где-то в недрах складывается, и уж тем более не будет знать, что за "вот это" имеется в виду.

    Отлично. С арифметикой мы разобрались — именно по описанным вами причинам в большинстве современных промышленных ЯП арифметика типизирована.

    Проблема возникает именно при попытке перенести тот же подход на бизнес-логику типа обработки заказов.
    Как мы уже обсуждали (правда, не все смогли не проигнорировать эту часть обсуждения), код обработки заказов мало похож на код по решению уравнений Шредингера.
    В нём как правило не получается написать даже a = b*c, а уж "написать функцию f посложнее" и вовсе невозможно.
    Потому что там не будет непрерывных цепочек a=b*c+d-(e-f)/g. А будут ровно цепочки типа "поднять из базы — двинуть на шаг вперёд".
    Из-за этого не получается ничего сэкономить на типах — нету повторного использования. Increase Amount уже вызывается ровно из одного места, и проверить корректность этого места вручную проще, чем навесить какие-то монструозности на её агументы, чтобы эти монструозности "проверили" на корректность три-четыре строки.


    Вы всё время пишете код, подразумевая "ну, на самом-то деле всё совсем не так, и вот тогда-то типизация ого-го!".
    А я читаю код как попытку привести реальный пример. И рассматриваю именно этот код, а не "ну, далее вы сами должны догадаться, что я прав".
    Представьте, что я вам пытаюсь объяснить, что такое "рифма". И говорю: "ну, вот например: белеет парус одинокий, в тумане моря голубом. Можно продолжать и дальше, но, я думаю, вы и сами поняли, что к чему".

    Те мои посты, обращённые к Мамуту, которые вам "понравились", вы, похоже, прочитали по диагонали. Ну или просто решили проигнорировать фразы типа "на воображаемом языке" и "гипотетически возможно". Поэтому я вам ещё раз объясню: чтобы ваши теоретические экзерсисы смогли принести практическую пользу, нужно не только научиться отслеживать типы в пределах развесистой функции f, но и решать проблему функции f, порезанной на сотню маленьких фрагментов. Нужно научиться отслеживать тип ордера за пределы функций Save и Load.

    J>Ты точно со мной разговариваешь?

    Ну да.

    J>ЗЫ А почему вдруг на вы, если не секрет?

    А я практически со всеми тут на вы.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[82]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.03.15 10:40
    Оценка:
    M>>Может. Возможно. Может. Возможно. Это мы уже проходили
    Автор: Mamut
    Дата: 26.02.15
    :


    EP>Тебя удивляет наличие условий для целесообразного применения какой-то техники?


    Меня удивляет, что на фоне огромного количества пафосных заявлений, «целесообразность» в итоге скатывается ко все возрастающему набору условий, когда ее можно увидеть.

    EP>>>Например предотвратит передачу MoneyAUD в MoneyUSD, или например радикально сократит количество перестановок аргументов валидных с точки зрения типов

    M>>Опять сплошная демагогия. У нас в насквозь динамической системе нет радикального количества перестановок аргументов

    EP>Есть:

    EP>есть только 6 перестановок аргументов которые скомпилируются.

    Ахахахахаха Я ему говорю, что у нас на практике этих перестановок нет, потому что перед глазами работающая система. Нет. Они, оказывается, у нас есть. Видимо, они существуют в теории.

    EP>>>Но какие из преимуществ динамического языка тогда останутся?

    M>>Вопрос должен быть поставлен наоборот: какие из преимуществ стат. языка останутся?

    EP>Почему наоборот-то? Ты предлагаешь в динамическом языке делать все runtime проверки, которые в статическом языке делаются в compile-time. При этом у тебя даже нет гарантии что эти runtime проверки поймают баг во время unit-test'ов.


    Ты и прочие оппоненты пока не осилили даже показать те самые стат. проверки на приближенном к реальности коде (все примеры — неполные, не выполняют требуемых условий и заканчиваются на «ну далее там все очевидно»).

    Почему я должен верить вам наслово, что эти самые проверки принесут вот мне лично в нашей далеко не маленькой системе какой-то ощутимый бенефит?

    (Если что, я прекрасно понимаю бенефиты, которые типы приносят в рефакторинг, например).

    EP>То есть ты потратил сравнимые усилия (я бы сказал даже большие), получив при этом меньший результат, при этом потеряв скорость разработки (которую часто называют одним из главных плюсов динамических языков).


    Ты себе придумал какой-то тезис, и им размахиваешь. Молодец.

    Скорость разработки у меня та же, или выше. Усилия я потратил ровно те же. Хотя вру. Усилия я потратил намного меньше. Потому что в то время, пока вы не осилили покрыть типами четыре условия, я на динамическом языке успел написать реальную
    Автор: Mamut
    Дата: 06.02.15
    задачу банальными ифами и покрыть это тестами. А вы скоро месяц уже не можете решить в десть раз более просту задачу

    Но да, но да, именно у вас разработка быстрее и усилий меньше

    Да вы, теоретики, просто загнетесь на реальной задаче.

    EP>>>Найденным?

    M>>А только они имеют смысл Я же говорю вы все — сугубые теортетики. Не найденные нас не интересуют, от слова «вообще».
    EP>То есть вас интересуют только те баги которые вы нашли, и совсем не интересуют те которые ещё остались? Жесть какая-то

    Нас интересуют все баги. Но в то время, как ты теоретизируешь о том, как у нас со счета USD списывается AUD, у нас такого на практике не происходит.

    Понимаешь, у нас система «вяжет, шьет, варит кофе и лечит кариес» уже далеко не первый год. Количество функционала на строчку кода у нас очень велико (функциональщина + паттерн матчинги всякие этому способствуют). Баги связанные непосредственно с «ой, мы сюда передали int, когда нам нужен string» возникают два раза в год.

    При этом тикетов у нас в системе скоро будет несколько десятков тысяч. Собственно багов из них — меньше десяти процентов (остальное — требования к изменению функционала). Из этих багов связанные с проблемами в типах? 1-2 в год

    Какой именно бенефит нам принесет, например, инвестиция в покрытии всего этого кода информацией о типах? Какой именно бенефит нам принесет стат. типизация на наших реальных задачах, если вы тут все хором показали, что вы не можете внятно решить даже 1% от 1% от 1% от решаемых в коде задач?

    Да. У нас бывают страшные и ужасные баги. И да, наверняка как-нибудь вылезет ужасный баг, связанный непостредственно с тем, что мы пытаемся сложить апельсины с бананами. И его пофиксят

    M>>Любые наводящие вопросы растворяются в словоблудии и наборе все более абсурдных условий, в которых она (якобы) помогает.

    EP>Переход на хамство в ответ на терпеливые объяснения — бывает и такое на RSDN

    Извини, у меня иммунитет на сказки и презрение к сказочникам. Ваши «терпеливые объяснения» в 99% случаев — именно сказки, демагогия и словоблудие


    dmitriid.comGitHubLinkedIn
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 05.03.15 12:58
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>То есть мы отлавливаем ошибку отсутствия if(hasRisk) выше по стеку?

    S>Да, изобразить это без буста не удастся. Впрочем, полезность этой процедуры не больше нуля. Забыть сделать проверку выше по стеку ничуть не более вероятно, чем забыть сделать проверку прямо в этой функции. Поэтому в результате мы имеем программу, в которой написаны две проверки на наличие риска — одна статическая на шаблонах, а другая — рантайм.
    S>Ну, либо программист забыл добавить первую из них, и компилятор ничем ему не помог.

    Забыть проверку PROP_IF выше по стеку нельзя, будет ошибка компиляции.
    Re[71]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 05.03.15 12:58
    Оценка: +1
    Здравствуйте, Sinclair, Вы писали:

    S>Я вам напомню, что функция, в которую не было предусмотрено передачи невалидного ордера, у нас уже была. Это increase_amount.

    S>Сигнатуру try_to_change_amount пришлось "испортить" из-за того, что есть функция LoadOrder, которая умеет загружать только "неизвестно какие" ордера.

    Все промежуточные функции будут требовать валидный ордер (неявным образом, просто из-за того, что где-то в глубине сидит increase_amount), кроме одной, где-то наверху, которая PROP_IF и делает.
    try_increase_amount — упрощенный пример. Между PROP_IF и функцией, в которой закодировано требование к HasRisk (increase_amount), может находиться еще куча функций.
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 05.03.15 13:03
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>ещё раз: всё, чего вы добились — это делегирования ответственности за коммуникацию с пользователем на уровень выше.


    Ну, примерно так.

    S>Т.е. в случае незатейливой increase_amount в ней все требования проверяются динамически, и в случае их нарушения пользователь получает Message Box с объяснением причин.

    S>А вы предлагаете обязать программиста, использующего increase_amount, провести проверки до вызова, чтобы в случае провала проверок пользователь получил MessageBox с объяснением причин.

    Да.

    S>Единственная проблема, которую ваше "решение" решает — это обеспечение разных текстов ошибок в разных контекстах (ну или, скажем, чтобы вызовы через web получали 400 bad request, а вызовы из rich application показывали MessageBox). Но для этой проблемы есть старое и гораздо более удобное решение — выброс исключений. Обязанность коммуницировать с пользователем делегируется вверх по стеку; а сам набор проверок гарантированно выполняется благодаря инкапсуляции.

    S>От статической типизации ожидают большего — например, сокращения количества рантайм-проверок, путём исключения избыточных.

    Как раз избыточные проверки во всех промежуточных слоях и устраняются. Остается один PROP_IF (один PROP_IF на одно свойство, если быть точным) где-то на входе, скорее всего сразу после загрузки ордера, и где-то в глубине системы вызов increase_amount. Весь код между ними свободен от проверок, и в то же время компилятор гарантирует, что increase_amount вызывается в корректном контексте.
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 05.03.15 13:12
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Нет. Я точно так же могу ошибочно вызвать функцию-оболочку откуда угодно, и компилятор прекрасно пропустит эту заведомую ошибку.


    Да нет никаких "функций-оболочек". В смысле каких-то тонких оболочек над "беззащитными" функциями. Эта "оболочка" покрывает толстый слой кода, а может и всю систему вообще. Внутри этой оболочки производится куча действий. Некоторые из которых "беззащитные", но компилятор гарантирует, что они заведомо находятся в "оболочке" (хотя она может находиться на 100 уровней выше).
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.03.15 13:49
    Оценка:
    S>Вот у вас есть слой "небезопасных" функций — тех, которые нельзя вызывать с произвольными агументами. Допустим, например, что можно нечаянно получить ордер с отрицательной суммой.

    Реальный код из нашей системы:

      if
        Amount < -49 ->  % allow -49 ore
          exit({negative_order, send_aborted, OrderNo});


    Никаких «нечаянно» Все предусмотрено


    dmitriid.comGitHubLinkedIn
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.03.15 13:51
    Оценка:
    ARK>Все промежуточные функции будут требовать валидный ордер (неявным образом, просто из-за того, что где-то в глубине сидит increase_amount), кроме одной, где-то наверху, которая PROP_IF и делает.
    ARK>try_increase_amount — упрощенный пример. Между PROP_IF и функцией, в которой закодировано требование к HasRisk (increase_amount), может находиться еще куча функций.

    Можно увидеть это в виде полной реализации моего примера? + что Синклер сказал
    Автор: Sinclair
    Дата: 05.03.15


    dmitriid.comGitHubLinkedIn
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.03.15 15:54
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>Ты издеваешься, что ли? Я ведь уже отвечал на этот вопрос. Считай, что ордер в моей статье пришел из базы. Или тебе SQL нужен?

    S>Меня просто не устраивает ваш ответ
    Чем конкретно? Надо все-таки SQL писать?

    S>>>б) нет функции обработки, которая бросает runtime ошибку для "статически-верифицируемых" свойств.


    S>Ключевое выделено. Ещё раз объясню простую вещь, которая до вас никак не хочет дойти: вы написали в два с половиной раза больше кода, при этом не совершив никакой полезной работы.

    S>Количество рантайм проверок — такое же
    да

    S>устойчивость кода к ошибкам программиста — такая же.

    Ну конечно же нет
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[72]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.03.15 16:18
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>Он не эквивалентен в смысле возможности написать ошибочный код.

    S>Ну конечно же эквивалентен.
    Ну конечно же нет.

    J>>У тебя увеличить amount по ошибке можно в обоих етках и вообще за пределами ифа. У меня нет. Именно в этом разница.

    S>Можно. И у вас — тоже можно, только на уровень выше.
    Ну конечно же нет.

    J>>Блин, ну ты же сам писал: "Код, содержащий незаконный переход, просто не скомпилируется."

    J>>Вот что в твоем коде может быть:
    J>>А в моем всего этого быть не может в принципе.
    S>Омг. Ну и что?

    Отличный ответ "Срезал!" (с)
    О чем дальше тут говорить — хз.

    S>Вот у вас есть слой "небезопасных" функций — тех, которые нельзя вызывать с произвольными агументами. Допустим, например, что можно нечаянно получить ордер с отрицательной суммой.


    S>Чтобы защитить эти "голые" функции, вы оборачиваете их в функции, которые выполняют рантайм-проверку аргументов перед вызовом. А "голые" функции вы прячете путём описания требований к аргументам в сигнатуре.


    Вот здесь у тебя ошибка в понимании моего кода, имхо. И тут моя вина тоже есть.
    Ты трактуешь increase_amount и try_to_change_amount в моем примере как пару. Типа каждый раз, когда ты хочешь позвать одно, ты должен позвать другое, и это другое — обертка для первого. И поэтому вдвое больше кода и прочая и тлен.

    Так вот это не так. Функции так называются просто потому, что я реализовывал задачу Мамута, в которой была ровно одна операция — увеличение ордера (и то, я назвал функцию не try_to_increase_amount, а try_to_change_amount).
    На самом деле никакой связки эти две функции в реальном коде образовывать не будут. Не будет никакого try_to_change_amount, а будет какой-нть process_order (я, кстати, вначале так и написал, но потом переименовал; как выясняется, зря).
    И в process_order будет разветвленная логика (по выполнению одного шага, если тебе так угодно, но мы же не знаем, загрузив ордер из БД, какой именно шаг можно исполнить сейчас), с обработкой рантайм-ошибок, кривых данных и прочего.
    Этих process_order может быть дофига, вообще говоря — по нажатию одной из кнопок в гуе, по приходу одного из многих сообщений по сети и т.д. и т.п. Будет process_button_a, process_button_b, process_network_message_c.
    В каждом будет какая-то логика.
    Так вот все эти многоэтажные типы задают правила, по которым может быть написан код всех вот этих process_xxx, чтобы гарантировать, что незаконных переходов в них не будт.

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

    Могу привлечь аналогию с ООП. Если у тебя настолько примитивная (архитектурно) программа, что деление на классы ничего полезного в ней не даст, то, наверное, ООП в ней не нужен — это будет ровно один класс на всю программу, что смотрится маразматично (ну примерно как смотрится Java-программа с классом HelloWorldApp с единственной функцией main). Но стоит программе немножко усложниться — и вдруг ООП становится прекрасным работающим средством.

    Так что да, если у тебя программа настолько примитивна, что каждая функция зовется ровно из одного места программы — тогда да. Ног тогда тебе и функция не нужна, вообще говоря, это чисто синтаксический сахар получается. Но ты, имхо, окажешься в меньшинстве с такой программой.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 05.03.15 16:39
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Из-за этого не получается ничего сэкономить на типах — нету повторного использования. Increase Amount уже вызывается ровно из одного места, и проверить корректность этого места вручную проще, чем навесить какие-то монструозности на её агументы, чтобы эти монструозности "проверили" на корректность три-четыре строки.


    я ответил рядом про "ровно из одного места". Имхо, таких программ, в которых функции вызываются ровно из одного места и повторного использования ноль — о-малое, и, мне кажется, ты сильно лукавишь, утверждая, что ничего подобного у тебя в программе нет.
    Даже "двинуть на шаг вперед" совершенно не означает, что переход в конкретное состояние будет осуществляться в единственном месте в коде.
    Гораздо более вероятно, что будет нечто вроде
    void do_one_step()
    {
      if (...)
        // do smth
        if (...)
          // do this
          IncreaseAmount()
        else
          // do smth else
          if (...)
            // do that
            IncreaseAmount()
            ApplyTax()
          else
            // just apply tax
            ApplyTax()
      else
        ApplyDiscount()
        IncreaseAmount()
        ApplyTax()
    }

    Можно, конечно, извратиться и вывернуть этот иф наизнанку, чтобы IncreaseAmount звался ровно из одного места, но это будет жестокий неподдерживаемый изврат типа
    if (условие на 55 строчек) ApplyDiscount()
    if (условие на 66 строчек) IncreaseAmount()
    if (условие на 77 строчек) ApplyTax()

    А если логику шага писать естественно, то, внезапно, окажется, что одни и те же функции зовутся из разных веток.

    То есть есть твой тезис сводится к "а вот если у нас в программе нет вообще никакого повторного использования, и если вдруг функции и есть, то все равно они зовутся из одного единственного места (т.е. эти функции — чистый синтаксический сахар, просто чтоб главная функция не занимала 50к строк) — то тогда нам все эти пляски с типизацией не нужны" — тут я с тобой, пожалуй, соглашусь. Для такого ограниченного случая — наверное, да, не нужны.
    Просто я как-то не предполагал, что ты всю дорогу говоришь о настолько ограниченном случае. Сорри.

    S>Нужно научиться отслеживать тип ордера за пределы функций Save и Load.

    Опять 25. PROP_IF именно этим и занимается — отслеживает тип.

    J>>Ты точно со мной разговариваешь?

    S>Ну да.
    Просто ты, похоже, какие-то вещи взял не из моих постов.

    J>>ЗЫ А почему вдруг на вы, если не секрет?

    S>А я практически со всеми тут на вы.
    Ну ладно. Обычно на вы означает ругань. Ничего, если я на ты продолжу?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 05.03.15 17:33
    Оценка: :)
    Здравствуйте, Mamut, Вы писали:

    ARK>>Все промежуточные функции будут требовать валидный ордер (неявным образом, просто из-за того, что где-то в глубине сидит increase_amount), кроме одной, где-то наверху, которая PROP_IF и делает.

    ARK>>try_increase_amount — упрощенный пример. Между PROP_IF и функцией, в которой закодировано требование к HasRisk (increase_amount), может находиться еще куча функций.

    M>Можно увидеть это в виде полной реализации моего примера? + что Синклер сказал
    Автор: Sinclair
    Дата: 05.03.15


    Нет, не хочется сейчас писать. Прошу не трактовать это как "вставание в позу" или что-то в этом роде, просто мне лень. Можно считать, что я проиграл в споре.
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.03.15 19:06
    Оценка:
    M>>Можно увидеть это в виде полной реализации моего примера? + что Синклер сказал
    Автор: Sinclair
    Дата: 05.03.15


    ARK>Нет, не хочется сейчас писать. Прошу не трактовать это как "вставание в позу" или что-то в этом роде, просто мне лень. Можно считать, что я проиграл в споре.


    Ты знаешь. Я это все же засчитаю проигрышем в споре.

    alex_public утверждает, что это — простой пример, а стат. типизация дает «некую помощи в организации сложных рантайм проверок». При этом не осилил ни «простой пример», ни организацию даже четырех проверок.

    Evgeny.Panasyuk утверждает, что «пытаться встроить контракт/предусловие в систему типов вполне имеет смысл», «Система типов позволяет энфорсить некоторые предусловия в compile-time» и т.п. При этом не осилил ни решить пример ни проверить в примере предусловия. Евгений, правда, был, по-моему, единственным, который привел еще и доп. примеры

    jazzer утверждает, что «[типы] решают задачу бана неправильного кода, где правильность закодирована в определении.», «поможет компилятор — как раз с ad-hoc изменениями требований», при этом не осилил полностью решить пример, несмотря на то, что в него специально добавлена ad-hoc'нусть, а вся «правильность» вылилась в полтора условия, ен решающих пример, и отмазки «далее все очевидно».

    Ты там где-то с jazzer'ом согласен, пример ты точно так же не осилил решить



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


    dmitriid.comGitHubLinkedIn
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 05.03.15 19:17
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ты знаешь. Я это все же засчитаю проигрышем в споре.


    Окей, пусть будет так. Я не против. Собственно, спорить у меня вообще цели не было. Просто хотел попробовать донести свою позицию. Не получилось. Ну — бывает.
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.03.15 19:31
    Оценка:
    M>>Ты знаешь. Я это все же засчитаю проигрышем в споре.

    ARK>Окей, пусть будет так. Я не против. Собственно, спорить у меня вообще цели не было. Просто хотел попробовать донести свою позицию. Не получилось. Ну — бывает.


    До меня вполне можно донести позицию Так только не доносят Отмахиваются всякими «там же очевидно» и «что там непонятно-то» И крутятся вокруг одного незавершенного куска кода


    dmitriid.comGitHubLinkedIn
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: Evgeny.Panasyuk Россия  
    Дата: 05.03.15 19:59
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Evgeny.Panasyuk утверждает, что «пытаться встроить контракт/предусловие в систему типов вполне имеет смысл», «Система типов позволяет энфорсить некоторые предусловия в compile-time» и т.п. При этом не осилил ни решить пример ни проверить в примере предусловия.


    Как сделать подобные проверки я показывал неоднократно: 1
    Автор: Evgeny.Panasyuk
    Дата: 09.02.15
    , 2
    Автор: Evgeny.Panasyuk
    Дата: 07.02.15
    , 3
    Автор: Evgeny.Panasyuk
    Дата: 05.02.15
    , 4
    Автор: Evgeny.Panasyuk
    Дата: 05.02.15
    . А вот делать это в том твоём конкретном примере — не имеет смысла, что я и сказал в первом же сообщении:

    http://rsdn.ru/forum/philosophy/5946894.1


    EP>Если же для запуска функции нет необходимости делать проверки, change_amount сама всё что нужно проверяет внутри, и более того её запуск с невыполненными условиями не является ошибкой, а вполне штатным режимом — то пытаться переписать все эти внутренние проверки на типы, не вижу смысла, это никак не отразится на местах вызова этой функции.

    И соответственно попытки реализовать часть логики из твоего конкретного примера (а не более общей задачи, в контексте большей системы и т.п) на типах, вызывают у оппонентов вполне резонные вопросы вида:

    http://rsdn.ru/forum/philosophy/5973404.1


    S>Ещё раз объясню простую вещь, которая до вас никак не хочет дойти: вы написали в два с половиной раза больше кода, при этом не совершив никакой полезной работы.
    S>Количество рантайм проверок — такое же; устойчивость кода к ошибкам программиста — такая же.
    S>Ну так если нету разницы, то зачем платить больше?

    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.03.15 20:43
    Оценка:
    Здравствуйте, Evgeny.Panasyuk, Вы писали:

    EP>Здравствуйте, Mamut, Вы писали:


    M>>Evgeny.Panasyuk утверждает, что «пытаться встроить контракт/предусловие в систему типов вполне имеет смысл», «Система типов позволяет энфорсить некоторые предусловия в compile-time» и т.п. При этом не осилил ни решить пример ни проверить в примере предусловия.


    EP>Как сделать подобные проверки я показывал неоднократно: 1
    Автор: Evgeny.Panasyuk
    Дата: 09.02.15
    , 2
    Автор: Evgeny.Panasyuk
    Дата: 07.02.15
    , 3
    Автор: Evgeny.Panasyuk
    Дата: 05.02.15
    , 4
    Автор: Evgeny.Panasyuk
    Дата: 05.02.15
    .


    Слова, слова, слова, цитаты, цитаты и полтора примера, после которых моментально возникает вопрос: как это развить, когда у тебя больше условий? Ответ? Нет, нигде нет ни ответа ни кода.


    EP>А вот делать это в том твоём конкретном примере — не имеет смысла, что я и сказал в первом же сообщении:


    Да-да. Ты придумал себе, что «не имеет смысла», хотя сам не можешь объяснить, почему не имеет смысла. Извини. Твои продолжающиеся заявления про предусловия меня уже устали.

    Я тут уже все объяснил: http://rsdn.ru/forum/philosophy/5973616.1
    Автор: Mamut
    Дата: 05.03.15


    Предусловия для функции x() никуда не делись, поэтому твои пафосные заявления про «пытаться встроить контракт/предусловие в систему типов вполне имеет смысл», «Система типов позволяет энфорсить некоторые предусловия в compile-time» должны продолжать работать

    EP>И соответственно попытки реализовать часть логики из твоего конкретного примера (а не более общей задачи, в контексте большей системы и т.п) на типах, вызывают у оппонентов вполне резонные вопросы вида:


    Понимаешь. Вы тут хором неспособны показать преимущества даже на маленькой задаче. Но требуете от нас, чтобы мы верили всем заявлениям про большие задачи

    Вот, пожалуйста. У тебя есть предусловия. Если хочешь, притворись, что функция update_amount в моем коде
    Автор: Mamut
    Дата: 06.02.15
    вызывается из стапятидесяти мест. Ты же этого добиваешься своими «предусловиями»? Ну дык, до этой функции есть еще что проверять и проверять

    Ну покажи мастеркласс наконец-то Пока что ты продолжаешь подтверждать мои слова: задачу никто не осилил, все, что осилили — это полтра незаконченных примера с «ну это же очевидно»


    dmitriid.comGitHubLinkedIn
    Re[82]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 06.03.15 01:38
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>просто добавляешь дополнительные проверки внутри can_increase_amount.


    M>Добавь, пожалуйста. Я же не просто так прошу привести пример законченного решения


    bool can_increase_amount(Order o)
    {
    if (
    если заказ помечен как кредит
    если заказ помечен как удаленный
    если заказ помечен как пассивный
    если заказ помечен как замороженный
    если заказ помечен как предоплата
    если заказ помечен как оплаченный по предоплате
    если в заказе нет товаров, которые можно вернуть
    
    если это аггрегированный заказ с прошедшим сроком оплаты
    если это архивный заказ при условии, что он оплачивается через account
    если сумма увеличивается, а это запрещено настройками заказа
    если сумма увеличивается, а мы уже отослали запрос на оплату в банк клиента
    если сумма увеличивается на сумму большую, чем указано в настройках (относительно оригинальной суммы заказа)
    
    если сумма увеличивается, а заказ проведен через новую систему
    если мы возвращаем деньги клиенту, заказ находится в одном из трех статусов, не является кредитом, и возвращаемая сумма меньше, чем максимальная разрешенная к возврату сумма
    )
      return true;
    else
      return false;
    }

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

    Естественно, это не убережет нас от ошибок в реализации can_increase_amount (и далее от этих слов читай в исходной статье http://rsdn.ru/forum/philosophy/5949645.1

    )


    соответственно, придется писать тесты на правильность реализации can_increase_amount, но не придется дополнительно проверять, что мы не вызываем финальную increase_amount не в том месте.

    Как видишь, все есть в статье, если ее прочитать до конца.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[77]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 06.03.15 06:33
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>Забыть проверку PROP_IF выше по стеку нельзя, будет ошибка компиляции.

    Зато можно забыть добавить требование в сигнатуру increase_amount.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 06.03.15 06:35
    Оценка: 24 (1) +1
    Здравствуйте, AlexRK, Вы писали:

    ARK>Как раз избыточные проверки во всех промежуточных слоях и устраняются. Остается один PROP_IF (один PROP_IF на одно свойство, если быть точным) где-то на входе, скорее всего сразу после загрузки ордера, и где-то в глубине системы вызов increase_amount. Весь код между ними свободен от проверок, и в то же время компилятор гарантирует, что increase_amount вызывается в корректном контексте.

    Нет никакой "глубины системы". Есть одна функция, которая поднимает заказ из базы и выполняет действие над ним.
    Ваша проблема — в том, что вы всё время подразумеваете не тот код, который пишете.
    Мамут вам же ясно сказал — пока что никто из участников забега не справился даже с упрощённым примером. Но вы упорно продолжаете ссылаться на "более сложный" пример. Которого нету.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 06.03.15 06:35
    Оценка: +1
    Здравствуйте, AlexRK, Вы писали:
    ARK>Да нет никаких "функций-оболочек". В смысле каких-то тонких оболочек над "беззащитными" функциями. Эта "оболочка" покрывает толстый слой кода, а может и всю систему вообще. Внутри этой оболочки производится куча действий.
    Это всё бла-бла-бла. Покажите код.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[77]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 06.03.15 06:39
    Оценка:
    Здравствуйте, jazzer, Вы писали:
    J>Чем конкретно? Надо все-таки SQL писать?
    Тем, что он ухудшает maintainability кода, хотя призван улучшать.


    S>>устойчивость кода к ошибкам программиста — такая же.

    J>Ну конечно же нет
    Ну конечно же да. Если вы прекратите воображать себе не тот код, который пишете, то вы сразу же увидите, что никаких преимуществ ваш подход не даёт.
    Ещё раз показываю вам код:
    public void FailMiserably()
    {
      var order = CreateNewOrder();
      order.SetRisk(true); 
      try_increase_amount(order, 1000); 
    }

    Этот код — ошибка программиста. Он нечаянно позвал try_increase_amount с невалидным ордером. В 100% случаев этот код приводит к рантайм-ошибке.
    То, что внутри try_increase_amount написано вдвое больше кода, не помогает ничем — это всего лишь лишний код, который нужно поддерживать.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[73]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 06.03.15 06:51
    Оценка:
    Здравствуйте, jazzer, Вы писали:
    J>Отличный ответ "Срезал!" (с)
    J>О чем дальше тут говорить — хз.
    Наверное, надо дальше почитать текст, не?

    J>Вот здесь у тебя ошибка в понимании моего кода, имхо. И тут моя вина тоже есть.

    Нету у меня никакой ошибки. Код семантически однозначен. Просто я не наделяю его сверхъестественными свойствами. Щас поясню.
    J>Ты трактуешь increase_amount и try_to_change_amount в моем примере как пару. Типа каждый раз, когда ты хочешь позвать одно, ты должен позвать другое, и это другое — обертка для первого. И поэтому вдвое больше кода и прочая и тлен.
    Не, вдвое больше кода — это потому, что без try_increase_amount ничего не работает. Поэтому вам приходится писать try_increase_amount в дополнение к "безопасной" increase_amount.

    J>На самом деле никакой связки эти две функции в реальном коде образовывать не будут. Не будет никакого try_to_change_amount, а будет какой-нть process_order (я, кстати, вначале так и написал, но потом переименовал; как выясняется, зря).

    J>И в process_order будет разветвленная логика (по выполнению одного шага, если тебе так угодно, но мы же не знаем, загрузив ордер из БД, какой именно шаг можно исполнить сейчас), с обработкой рантайм-ошибок, кривых данных и прочего.
    С чего бы это? Мы как раз знаем, какой шаг мы хотим исполнить — ордера сами по себе состояние не меняют.
    Есть события — типа "действия пользователя", "приход подтверждения платежа", "приход подтверждения от системы доставки".
    Даже те действия, которые идут в workflow "подряд", могут быть разрезаны на отдельные части — чтобы гарантировать восстановление workflow в корректном состоянии после сбоев.

    J>Этих process_order может быть дофига, вообще говоря — по нажатию одной из кнопок в гуе, по приходу одного из многих сообщений по сети и т.д. и т.п. Будет process_button_a, process_button_b, process_network_message_c.

    J>В каждом будет какая-то логика.
    Логика, в основном, будет сводиться к проверкам состояния ордера, и переводу его в следующее состояние в зависимости от них.
    Те самые if(HasRisk).

    J>Так вот все эти многоэтажные типы задают правила, по которым может быть написан код всех вот этих process_xxx, чтобы гарантировать, что незаконных переходов в них не будт.

    В вашем конкретном подходе все эти многоэтажные типы не помогают никак. Потому, что и без них increase_amount выполнит все необходимые проверки, и откажется двигать ордер вперёд. Будет выброшено исключение, транзакция откачена, пользователь (или внешняя система) получат внятное сообщение о причинах отказа. Проверяются ведь не абстракции (типа указатель!=Null), а бизнес-правила.

    J>Если ты уперся и настаиваешь, что у тебя в коде живет ровно один вызов каждой функции — тогда да, наверное, у тебя в коде все это не нужно. Как не нужно типизировать код с интом, если это всего лишь один инт на всю программу.

    Воот, теперь вы постепенно начинаете понимать суть задачи. Дело даже не в том, что нет многократно вызываемых функций. Дело в том, что проверки можно проводить только на таком уровне, который вызывается как правило однажды. Нет правила, которое бы запрещало отрицательные суммы в ордерах. Правила обнаруживаются на уровне бизнес-значимых действий, типа "провести возврат". А такие действия очень редко вызываются из многих мест.

    Это не означает, что "типы не помогут". Это означает, что нужно отказаться от наивного подхода, и решать задачу с другой стороны.

    J>Могу привлечь аналогию с ООП. Если у тебя настолько примитивная (архитектурно) программа, что деление на классы ничего полезного в ней не даст, то, наверное, ООП в ней не нужен — это будет ровно один класс на всю программу, что смотрится маразматично (ну примерно как смотрится Java-программа с классом HelloWorldApp с единственной функцией main). Но стоит программе немножко усложниться — и вдруг ООП становится прекрасным работающим средством.

    Отличная аналогия. Нет другой такой архитектуры (ну, разве что кроме SOA), которой бы злоупотребляли с таким энтузиазмом, как ООП.

    J>Так что да, если у тебя программа настолько примитивна, что каждая функция зовется ровно из одного места программы — тогда да. Ног тогда тебе и функция не нужна, вообще говоря, это чисто синтаксический сахар получается. Но ты, имхо, окажешься в меньшинстве с такой программой.

    Подождём Мамута — пусть он скажет, из скольки мест вызывается increase_amount.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[83]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 06.03.15 07:23
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>При этом тикетов у нас в системе скоро будет несколько десятков тысяч. Собственно багов из них — меньше десяти процентов (остальное — требования к изменению функционала). Из этих багов связанные с проблемами в типах? 1-2 в год

    Вот тут я хочу прояснить один момент: это утверждение скорее говорит о том, что у вас бедная система типов.
    Ход мысли должен быть примерно таким: мы (абстрактное человечество) хотим, чтобы больше багов ловилось системой типов.
    Т.е. из тех 10% ещё 8% поймать до того, как они попадут в продакшн.
    Сложность — в том, что хорошо заточенный под задачу мозг с трудом видит альтернативы.

    Ну, абстрактно — видим NullReferenceException. Придумать систему типов, которая бы поймала попытку отдать за пределы фазы конструирования объект с непроинициализированной ссылкой — значит выйти за пределы "коробки". В чистом C# такая система типов невозможна. Даже если удастся её прикрутить на codeContracts, это может потребовать ещё и перепилить часть уже работающей системы — изменить декомпозицию, и т.п.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[84]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 06.03.15 12:45
    Оценка:
    M>>При этом тикетов у нас в системе скоро будет несколько десятков тысяч. Собственно багов из них — меньше десяти процентов (остальное — требования к изменению функционала). Из этих багов связанные с проблемами в типах? 1-2 в год
    S>Вот тут я хочу прояснить один момент: это утверждение скорее говорит о том, что у вас бедная система типов.
    S>Ход мысли должен быть примерно таким: мы (абстрактное человечество) хотим, чтобы больше багов ловилось системой типов.
    S>Т.е. из тех 10% ещё 8% поймать до того, как они попадут в продакшн.
    S>Сложность — в том, что хорошо заточенный под задачу мозг с трудом видит альтернативы.

    Да, возможно. Проблема в том, что пока никто не может внятно эти альтернативы показать Во многом, вокруг этого весь спор и крутится.

    То есть уже указанная мной реальная задача
    Автор: Mamut
    Дата: 06.02.15
    возможно может быть описана типами и возможно ошибки в ней могут стать ошибками типизации, но пока я в упор не вижу, как это можно сделать, не потратив какое-то невменяемое количество времени, выписывая это в типах Может быть, именно поэтому все примеры, что мы видим, реализуют всего два-три условия ля последовательности простейших шагов?


    dmitriid.comGitHubLinkedIn
    Re[83]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 06.03.15 13:49
    Оценка:
    M>>Добавь, пожалуйста. Я же не просто так прошу привести пример законченного решения
    J>Как я говорил, все зависит от того, сколько проверок ты захочешь перенести в типы. Можешь оставить вот так, как есть, а можешь разнести на минипроверки и свойство на каждое.

    Перенеси, пожалуйста.

    Тебе напомнить про то, что ты сюда принес презентацию из банка. Ты так же утверждал, например, «поможет компилятор — как раз с ad-hoc изменениями требований».

    Я специально привел типичную для банка задачу. Специально внес в нее условия и ad-hoc изменения.

    Результат?

    Proof of concept
    Автор: jazzer
    Дата: 10.02.15
    с двумя условиями. Не решает даже первого пункта из моей задачи. Заканчивается на «ну там все легко/понятно/очевидно». Когда спрашиваешь: «мне не понятнои не очевидно, можно увидеть это развернутее», получаю раз за разом «что тебе там непонятно»


    И все хором говорят про простоту задачи, тривиальность и очевидность

    Могу во второй раз спросить: покажи мне, пожалуйста, реализацию того самого «очевидно понятного мета-свойства IncreaseAmountOK», желательно в сочетании с кодом, чтобы можно было увидеть, как все эти заявления работают на практике? Если это очевидно и понтяно ©™

    Я уже даже не прошу от тебя реализовать все три шага задачи


    dmitriid.comGitHubLinkedIn
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 06.03.15 13:54
    Оценка:
    J>>Так что да, если у тебя программа настолько примитивна, что каждая функция зовется ровно из одного места программы — тогда да. Ног тогда тебе и функция не нужна, вообще говоря, это чисто синтаксический сахар получается. Но ты, имхо, окажешься в меньшинстве с такой программой.
    S>Подождём Мамута — пусть он скажет, из скольки мест вызывается increase_amount.

    Данный конкретный increae_amount вызывается из двух мест:

    — из xml-rpc метода
    — из пакетной обработки заказов, которая, по сути, является все тем же xml-rpc вызовом.

    Оба места передают в increase_amount банально Order, потому что все нужные проверки проводит собственно increase_amount (зачем проверками заниматься коду, не связанному с этим? Да незачем )


    dmitriid.comGitHubLinkedIn
    Re[70]: Haskell нужен! (в Standard Chartered Bank)
    От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
    Дата: 07.03.15 07:09
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    ARK>>>Чем вам не нравится пост jazzer'a? http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15

    S>>Тем, что там нету Load, зато есть runtime-проверки.

    J>PROF_IF — это рантайм-проверка и есть.


    Re[84]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 08.03.15 08:43
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>>>Добавь, пожалуйста. Я же не просто так прошу привести пример законченного решения

    J>>Как я говорил, все зависит от того, сколько проверок ты захочешь перенести в типы. Можешь оставить вот так, как есть, а можешь разнести на минипроверки и свойство на каждое.

    M>Перенеси, пожалуйста.


    Да ты мастер стирать ответы, я вижу.

    M>Результат?


    Результат очень простой — ты просто стираешь то, что тебе не нравится.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[78]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 08.03.15 08:45
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, AlexRK, Вы писали:


    ARK>>Забыть проверку PROP_IF выше по стеку нельзя, будет ошибка компиляции.

    S>Зато можно забыть добавить требование в сигнатуру increase_amount.

    Это будет ошибка соответствия кода требованиям. Она никак автоматически не решается. Даже если требования выразить формально и на их основе сгенерить код программы — всегда останется открытым вопрос соответствия формального описацию тому, что имел в виду заказчик.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[74]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 08.03.15 08:56
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Не, вдвое больше кода — это потому, что без try_increase_amount ничего не работает. Поэтому вам приходится писать try_increase_amount в дополнение к "безопасной" increase_amount.


    Вот я для кого написал "Не будет никакого try_to_change_amount, а будет какой-нть process_order", интересно?

    J>>Воот, теперь вы постепенно начинаете понимать суть задачи. Дело даже не в том, что нет многократно вызываемых функций.

    Дело именно в этом. Ты придумал одну единственную формулировку задачи, где подход не сработает, и вместо того, чтоб сразу сказать, что вот ты тут придумал такой граничный случай (и я бы с тобой согласился, что да, в этом случае оверкилл), ты это выдаешь за общее место и на этом основании размазываешь подход в целом. Как ты там сказал выше — у тебя черный пояс по этому делу?


    J>>Так что да, если у тебя программа настолько примитивна, что каждая функция зовется ровно из одного места программы — тогда да. Но тогда тебе и функция не нужна, вообще говоря, это чисто синтаксический сахар получается. Но ты, имхо, окажешься в меньшинстве с такой программой.


    S>Подождём Мамута — пусть он скажет, из скольки мест вызывается increase_amount.


    А чего его ждать, если он задачу изначально сформулировал в терминах кучи условий на один единственный вызов increase_amount.
    Он нигде не давал задачу вида: а закодируйте мне вот такую логику.
    Он (ну я грешным делом так подумал) просил просто продемонстрировать общий подход.
    Подход был продемонстрирован.
    Кто ж знал, что это вся задача и есть (ну или, по крайней мере, ты ее представляешь таковой)
    В общем, тема скатилась в классическое КСВ, увы А обещала быть интересной.

    ЗЫ Я вот по системе, которую пишу на работе, могу сказать, что различные операции над ордерами (типа изменить цену, убить, вставить другой ордер рядом и т.д.) вызываются из кучи разных мест, в зависимости от того, что стратегии в данном месте почудилось.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[85]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 08.03.15 10:24
    Оценка:
    M>>>>Добавь, пожалуйста. Я же не просто так прошу привести пример законченного решения
    J>>>Как я говорил, все зависит от того, сколько проверок ты захочешь перенести в типы. Можешь оставить вот так, как есть, а можешь разнести на минипроверки и свойство на каждое.

    M>>Перенеси, пожалуйста.


    J>Да ты мастер стирать ответы, я вижу.


    Что именно в твоем ответе я не должен был стирать? Твою шутку про «реализацию кода»? Она нерелевантна, я ее стер. Сразу за этой шуткой идет текст, который я оставил.


    M>>Результат?


    J>Результат очень простой — ты просто стираешь то, что тебе не нравится.



    Я стираю много текста ни о чем. Я прошу от тебя одного: покажи мне пожалуйста в коде. Законченном. Как это будет выглядеть.

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

    Покажи мне, где там пример кода мета-свойства IncreaseAmountOK, и как его использовать.

    Покажи мне пошагово, как и где твой код, реализующий шаг 1 легким движением руки превращается в код, реализующий шаг два (напомню: именно ты говорил о том, что типы позволяют легко справляться с ad-hoc изменениями). Почему у тебя все заканчивается строго и исключительно на «там дальше просто/очевидно/поянтно»?

    Вот мне не просто, не очевидно и не понятно Поэтому я прошу, чтобы мне показали что-нибудь более полное, чем незаконченный код, который «ну дальше очевидно»


    Ну и кто из нас занимается стиранием неудобных ответов/вопросов? Точно не я. Заметь: при всем твоем пафосе ты так и не осилил полноценно решить даже первый шаг моей задачи. Но оскорблять меня и других собеседников — о да, это ты умеешь


    dmitriid.comGitHubLinkedIn
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 08.03.15 10:28
    Оценка:
    J>А чего его ждать, если он задачу изначально сформулировал в терминах кучи условий на один единственный вызов increase_amount.

    Ты притащил сюда презентацию из банка. Я тебе дал задачу из банка. ВНЕЗАПНО «задача не такая»

    J>Он нигде не давал задачу вида: а закодируйте мне вот такую логику.


    Хорошо: закодируй мне такую логику. От начала до конца. Безо всяких «ну там дальше все очевидно». Мне не очевидно

    J>Он (ну я грешным делом так подумал) просил просто продемонстрировать общий подход.

    J>Подход был продемонстрирован.

    «Общий подход» — это сферовакуумный конь.

    J>ЗЫ Я вот по системе, которую пишу на работе, могу сказать, что различные операции над ордерами (типа изменить цену, убить, вставить другой ордер рядом и т.д.) вызываются из кучи разных мест, в зависимости от того, что стратегии в данном месте почудилось.


    Ну вот покажи полноценное решение такой задачи со своим подходом на типах. Безо всякого «вот тут очевидно» и «вы тупые, статьи не читаете»


    dmitriid.comGitHubLinkedIn
    Re[86]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 08.03.15 17:34
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>>>>>Добавь, пожалуйста. Я же не просто так прошу привести пример законченного решения

    J>>>>Как я говорил, все зависит от того, сколько проверок ты захочешь перенести в типы. Можешь оставить вот так, как есть, а можешь разнести на минипроверки и свойство на каждое.

    M>>>Перенеси, пожалуйста.


    J>>Да ты мастер стирать ответы, я вижу.


    M>Что именно в твоем ответе я не должен был стирать? Твою шутку про «реализацию кода»? Она нерелевантна, я ее стер. Сразу за этой шуткой идет текст, который я оставил.


    А это, внезапно, не шутка была. Помедитируй над этим. Соотнеси с текстом статьи.

    M>>>Результат?


    J>>Результат очень простой — ты просто стираешь то, что тебе не нравится.


    M>Я стираю много текста ни о чем. Я прошу от тебя одного: покажи мне пожалуйста в коде. Законченном. Как это будет выглядеть.


    У меня нет твоей задачи, "законченной". Есть только вызов increase_amount. Это задача ни о чем, это и не задача даже. Ее можно решить как одним мега-свойством IncreaseAmountOK, так и кучей элементарных свойств или какой-то их комбинации.
    Я не знаю, какие из элементарных условий, составляющие can_increase_amount, тебе могут понадобиться в других местах — поэтому не могу предложить адекватного разбиения. Без разбиения это будет просто то, что я показал выше, но ты почему-то считаешь это шуткой.

    M>Покажи мне, где там пример кода мета-свойства IncreaseAmountOK, и как его использовать.


    я показал, ты стер

    M>Покажи мне пошагово, как и где твой код, реализующий шаг 1 легким движением руки превращается в код, реализующий шаг два (напомню: именно ты говорил о том, что типы позволяют легко справляться с ad-hoc изменениями). Почему у тебя все заканчивается строго и исключительно на «там дальше просто/очевидно/поянтно»?


    Потому что у тебя там штук 20 условий, мне их кодировать тупо в лом. Тем более если они не нужны по-одному, а только все скопом, что упаковывается в can_increase_amount (то, что я показал выше, то, что ты назвал шуткой).

    M>Ну и кто из нас занимается стиранием неудобных ответов/вопросов? Точно не я. Заметь: при всем твоем пафосе ты так и не осилил полноценно решить даже первый шаг моей задачи. Но оскорблять меня и других собеседников — о да, это ты умеешь


    Словоблудами и сказочниками (и прочая, лень искать эпитеты) тут всех вокруг называешь именно ты. Причем я не вижу, чтоб ты делал какие-то усилия, чтоб разобраться, если честно. Больше выглядит как "я вас тут размажу, как вы ни упирайтесь". Не особо конструктивная позиция.
    А, да, еще "пафос". Вместо того, чтобы разобраться, ты просто обзываешься. Легче легкого назвать все, что пишет собеседник, пафосом и сказками. Только вот странно потом удивляться тому, что собеседник почему-то не горит желанием выкатить на-гора кучу кода, чтоб получить очередную порцию издевательств. Спасибо.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 08.03.15 17:44
    Оценка: +1 :)
    Здравствуйте, Mamut, Вы писали:

    J>>А чего его ждать, если он задачу изначально сформулировал в терминах кучи условий на один единственный вызов increase_amount.


    M>Ты притащил сюда презентацию из банка. Я тебе дал задачу из банка. ВНЕЗАПНО «задача не такая»


    Я притащил презентацию не из своего банка. Я не видел их кода, не знаю, какие конкретно у них задачи были решены на типах. Такчто хватит с меня спрашивать за содержание этой презентации. Не я ее писал.
    Если ты лично считаешь, что там все вранье, несмотря на то, что их система уже лет 8 работает — твое право

    J>>Он нигде не давал задачу вида: а закодируйте мне вот такую логику.


    M>Хорошо: закодируй мне такую логику. От начала до конца. Безо всяких «ну там дальше все очевидно». Мне не очевидно


    какую логику? Где логика? Есть миллион условий на то, когда можно увеличивать amount. Это ты называешь логикой?

    J>>Он (ну я грешным делом так подумал) просил просто продемонстрировать общий подход.

    J>>Подход был продемонстрирован.
    M>«Общий подход» — это сферовакуумный конь.
    Ну конечно же, как же иначе. Общих подходов не бывает, их демонстрировать не надо. Любой подход должен доказать совю полезность в задаче увеличения amount-а (ну или расстановки 8 ферзей, по вкусу), иначе он не имеет смысла и объявляется пафосным сфероконем, а код, который демонстрирует работу подхода на двух условиях, ничего не значит, потому что не показана работа на 20 условиях.

    Я боюсь представить, как бы ты читал про циклы. Тебя наверняка обычное описание циклов из книжки не устроило бы. Тебе понадобился бы либо цикл по 20 счетчикам сразу, либо 20 вложенных циклов, а лучше — и то, и другое. И пока тебе не продемонстрируют код с 20 счетчиками и 20 уровнями вложенности — ты будешь говорить, что циклы — это вакуумный сфероконь, сказки, пафос и словоблудие.

    J>>ЗЫ Я вот по системе, которую пишу на работе, могу сказать, что различные операции над ордерами (типа изменить цену, убить, вставить другой ордер рядом и т.д.) вызываются из кучи разных мест, в зависимости от того, что стратегии в данном месте почудилось.


    M>Ну вот покажи полноценное решение такой задачи со своим подходом на типах. Безо всякого «вот тут очевидно» и «вы тупые, статьи не читаете»


    Какой задачи? Где она? Миллион условий на то, когда можно увеличивать amount? Ну и тупым я тебя нигде не обзывал, впредь воздержись от подобных "цитат", если только не планируешь окончательно потерять лицо.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[87]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 08.03.15 17:49
    Оценка:
    M>>Я стираю много текста ни о чем. Я прошу от тебя одного: покажи мне пожалуйста в коде. Законченном. Как это будет выглядеть.

    J>У меня нет твоей задачи, "законченной". Есть только вызов increase_amount. Это задача ни о чем, это и не задача даже.


    Это задача из банка. Ты же тут притащил презенетацию из банка про типы. Ты думаешь у них что-то сильно другое?

    J>Ее можно решить как одним мега-свойством IncreaseAmountOK, так и кучей элементарных свойств или какой-то их комбинации.


    Можно наконец-то увидеть это решение? Хоть мегасвойством хоть комбинацией? Я слышу много разговоров о том, как это можно решить и ноль решений

    Да. Мне непонятно, как это решить, несмотря на тот кусок кода, что ты привел ПОтому что твой кусок кода не отвечает на вопросы:
    — что будет, когда условий больше двух
    — как реализовать то самое «мета-свойство»



    J>Потому что у тебя там штук 20 условий, мне их кодировать тупо в лом. Тем более если они не нужны по-одному, а только все скопом, что упаковывается в can_increase_amount (то, что я показал выше, то, что ты назвал шуткой).


    Давай я тебя процитирую тебя снова:

    Надеюсь, идея понятна. Дополнительные требования навешиваются аналогично. Если элементарных свойств/требований становится слишком много, то можно их просто упаковать в мета-свойство IncreaseAmountOK, которое



    И снова задам свой вопрос:

    окажи мне, где там пример кода мета-свойства IncreaseAmountOK, и как его использовать.

    Покажи мне пошагово, как и где твой код, реализующий шаг 1 легким движением руки превращается в код, реализующий шаг два (напомню: именно ты говорил о том, что типы позволяют легко справляться с ad-hoc изменениями). Почему у тебя все заканчивается строго и исключительно на «там дальше просто/очевидно/поянтно»?

    Вот мне не просто, не очевидно и не понятно Поэтому я прошу, чтобы мне показали что-нибудь более полное, чем незаконченный код, который «ну дальше очевидно»


    Что тебе не нравится в этом вопросе? Что в этом вопросе неконструктивного, и что именно ты тут считаешь «стиранием неудобных ответов» и «нежеланием конструктивного спора»? Я многого прошу?


    M>>Покажи мне, где там пример кода мета-свойства IncreaseAmountOK, и как его использовать.

    J>я показал, ты стер

    Это называется не показал. Это называется послал на три буквы.


    M>>Ну и кто из нас занимается стиранием неудобных ответов/вопросов? Точно не я. Заметь: при всем твоем пафосе ты так и не осилил полноценно решить даже первый шаг моей задачи. Но оскорблять меня и других собеседников — о да, это ты умеешь


    J>Словоблудами и сказочниками (и прочая, лень искать эпитеты) тут всех вокруг называешь именно ты. Причем я не вижу, чтоб ты делал какие-то усилия, чтоб разобраться, если честно.


    Я пытаюсь Я постоянно задаю вопросы типа: что будет, если условий будет не одно, не два, а три-пять-десять. Твои ответы показать? Я задаю вопросы типа: у нас нет никакого SendOrder перед increase_amount, у нас заказ приходит как есть, из базы, и с ним надо работать. Ответы показать? Я задаю вопросы типа: у нас требования меняются, ты говоришь, типы помогут в этом, покажи на примере. Ответ хоть один появился? Я говорю: я не представляю, как реализуется свойство IncreaseAmountOK, можно увидеть, как оно реализуется и связывается со всем остальным кодом. Где хоть один ответ?

    Ну и т.п.

    J>А, да, еще "пафос". Вместо того, чтобы разобраться, ты просто обзываешься.


    Я пытаюсь разобраться. Я тебя не даром прошу сделать простейшее:

    — решить хотя бы первый пункт моей задачи
    — показать, как типы хорошо помогают при с ad-hoc программировании (твое утверждение, поэтому оно есть в здаче)
    — если ни то н идругое, показать мне тот самое «понятноочевидное мета-свойство IncreaseAmountOK», потому что мне не понятно и не очевидно, как оно пишется.

    Пока что ты продолжаешь называть меня тупым и постоянно тыкаешь своим сообшщением, в котором нет ни первого ни второго ни третьего. Ну и да, несмотря на понятность и очевидность, тебе уже внезапно писать «20 условий», хотя в задаче их далеко не 20. 20 их в реальной задаче, и я не устану повторять, что реальную задачу вы всем скопом вообще не осилите решить. Несмотря на громкие заявления про «можно решить мега-свойством или комбинацией элементарных свойств»


    dmitriid.comGitHubLinkedIn
    Re[77]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 08.03.15 17:51
    Оценка:
    J>>>Он нигде не давал задачу вида: а закодируйте мне вот такую логику.
    M>>Хорошо: закодируй мне такую логику. От начала до конца. Безо всяких «ну там дальше все очевидно». Мне не очевидно
    J>какую логику? Где логика? Есть миллион условий на то, когда можно увеличивать amount. Это ты называешь логикой?

    Ага. Внезапно тебе уже не нравится логика. Что ты подразумеваешь под словом «логика»?

    J>>>ЗЫ Я вот по системе, которую пишу на работе, могу сказать, что различные операции над ордерами (типа изменить цену, убить, вставить другой ордер рядом и т.д.) вызываются из кучи разных мест, в зависимости от того, что стратегии в данном месте почудилось.


    M>>Ну вот покажи полноценное решение такой задачи со своим подходом на типах. Безо всякого «вот тут очевидно» и «вы тупые, статьи не читаете»

    J>Какой задачи? Где она?


    Выделенное.

    J>Миллион условий на то, когда можно увеличивать amount?


    Не миллион. Всего четыре (если не ошибаюсь) в моей изначальной задаче.


    dmitriid.comGitHubLinkedIn
    Re[79]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 09.03.15 10:47
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Это будет ошибка соответствия кода требованиям. Она никак автоматически не решается. Даже если требования выразить формально и на их основе сгенерить код программы — всегда останется открытым вопрос соответствия формального описацию тому, что имел в виду заказчик.

    Ещё раз: внося требование в сигнатуру функции, вы просто делаете "заметку на память": "не забыть проверить значение аргумента перед вызовом и выкинуть исключение".
    А Мамут вместо этой "заметки" просто пишет проверку и выброс исключения. Что это означает? Что ни один из вас не забыл выполнить эту проверку.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[75]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 09.03.15 10:55
    Оценка: 18 (1) +1
    Здравствуйте, jazzer, Вы писали:

    J>Вот я для кого написал "Не будет никакого try_to_change_amount, а будет какой-нть process_order", интересно?

    Понятия не имею. Наверное, для тех, кто никогда в жизни не писал системы обработки заказов, и может поверить в эту смелую фантазию.

    J>Дело именно в этом. Ты придумал одну единственную формулировку задачи, где подход не сработает, и вместо того, чтоб сразу сказать, что вот ты тут придумал такой граничный случай (и я бы с тобой согласился, что да, в этом случае оверкилл), ты это выдаешь за общее место и на этом основании размазываешь подход в целом.

    Вы что-то путаете. Формулировка задачи была дана выше в топике. За общее место я ничего не выдаю — я вам уже тридцать сообщений пишу, что для этой задачи этот подход неприемлем.
    Это вы почему-то всё время съезжаете с задачи процессинга ордеров на какой-то вымышленный "общий случай".

    J>А чего его ждать, если он задачу изначально сформулировал в терминах кучи условий на один единственный вызов increase_amount.


    J>Он нигде не давал задачу вида: а закодируйте мне вот такую логику.

    Да ладно! А я вот вижу, что он попросил закодировать именно такую логику. И даже привёл своё решение.
    J>Он (ну я грешным делом так подумал) просил просто продемонстрировать общий подход.
    Нет. Он уже раз семьдесят написал, что "общий подход" ему известен. И про то, что он не даёт складывать метры с килограммами, мы с ним тоже в курсе.
    Вопрос был про решение конкретных задач по программированию бизнес-логики.
    J>Подход был продемонстрирован.
    J>ЗЫ Я вот по системе, которую пишу на работе, могу сказать, что различные операции над ордерами (типа изменить цену, убить, вставить другой ордер рядом и т.д.) вызываются из кучи разных мест, в зависимости от того, что стратегии в данном месте почудилось.
    Ок, из разных мест. Хорошо. Наверное, тогда вы можете продемонстрировать свой пример, в котором от всех этих украшательств есть какая-то польза?
    Ну, кроме творческого разнообразия — типа, что в одном месте при проверке бросается исключение, во втором возвращается код ошибки, а в третьем ветка else просто не содержит никакого кода?
    В приведённых вами примерах ровно никакой пользы нет — код бросает те же исключения в тех же ситуациях. И те ошибки, которые может "отловить" ваш код, в безтиповом коде вообще не возникают от слова "никак".
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 09.03.15 23:12
    Оценка:
    J>>Он нигде не давал задачу вида: а закодируйте мне вот такую логику.
    S>Да ладно! А я вот вижу, что он попросил закодировать именно такую логику. И даже привёл своё решение.

    Уже поздно. Там уже внезапно неправильная логика
    Автор: jazzer
    Дата: 08.03.15


    dmitriid.comGitHubLinkedIn
    Re[78]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 10.03.15 13:19
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>>>Он нигде не давал задачу вида: а закодируйте мне вот такую логику.

    M>>>Хорошо: закодируй мне такую логику. От начала до конца. Безо всяких «ну там дальше все очевидно». Мне не очевидно
    J>>какую логику? Где логика? Есть миллион условий на то, когда можно увеличивать amount. Это ты называешь логикой?

    M>Ага. Внезапно тебе уже не нравится логика. Что ты подразумеваешь под словом «логика»?


    Какие-то действия. Типа "если а, то делаем б и в, а если г и д — то е". При этом у действий есть конкретные предусловия, которые нарушать нельзя. А у тебя всего одно действие — увеличить amount. На нем можно продемонстрировать подход в общем, но тебя это не устроило

    J>>>>ЗЫ Я вот по системе, которую пишу на работе, могу сказать, что различные операции над ордерами (типа изменить цену, убить, вставить другой ордер рядом и т.д.) вызываются из кучи разных мест, в зависимости от того, что стратегии в данном месте почудилось.


    M>>>Ну вот покажи полноценное решение такой задачи со своим подходом на типах. Безо всякого «вот тут очевидно» и «вы тупые, статьи не читаете»

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

    J>>Миллион условий на то, когда можно увеличивать amount?


    M>Не миллион. Всего четыре (если не ошибаюсь) в моей изначальной задаче.


    Ну там же усложнение идет просто за счет добавления условий, навешенных на то же самое действие increase_amount, разве не так?


    ЗЫ Насчет "вы тупые" — будь добр, приведи линк на такое моё высказывание или извинись.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[88]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 10.03.15 13:30
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>>>Я стираю много текста ни о чем. Я прошу от тебя одного: покажи мне пожалуйста в коде. Законченном. Как это будет выглядеть.


    J>>У меня нет твоей задачи, "законченной". Есть только вызов increase_amount. Это задача ни о чем, это и не задача даже.


    M>Это задача из банка. Ты же тут притащил презенетацию из банка про типы. Ты думаешь у них что-то сильно другое?


    Уверен. Они риск пишут, а не ордер-процессинг, там же написано.
    Что конкретно у них в типах, я не знаю — я их кода не видел.
    То, о чем я писал в своем примере — это имеет отношение скорее к зависимым типам, и может совершенно не иметь отношения к тому, что у них на Хаскеле.

    J>>Ее можно решить как одним мега-свойством IncreaseAmountOK, так и кучей элементарных свойств или какой-то их комбинации.

    M>Можно наконец-то увидеть это решение? Хоть мегасвойством хоть комбинацией? Я слышу много разговоров о том, как это можно решить и ноль решений

    сорри, не раньше апреля (отпуск, работа). До тех пор могу только односложно отвечать по сути.

    M>Да. Мне непонятно, как это решить, несмотря на тот кусок кода, что ты привел ПОтому что твой кусок кода не отвечает на вопросы:

    M>- что будет, когда условий больше двух
    Я показал, как добавить к одному свойству второе. Третье, четвертое и т.д. добавляются аналогично. Не будешь же ты говорить, что не понимаешь, как добавить третье свойство?

    M>- показать, как типы хорошо помогают при с ad-hoc программировании (твое утверждение, поэтому оно есть в здаче)


    Я показал, как это происходит при добавлении второго свойства (оно было добавлено ad-hoc, изначально его не было). При добавлении третьего, четвертого и т.д. будет ровно то же самое (хотя если свойства добавляются пачкой, можно и в одну функцию упаковать, чтобы не было леса из PROP_IF, особенно если в других ветках ничего не будет).
    Ты ведь понял, как я добавил второе свойство? Сможешь ведь по аналогии добавить третье, четвертое?


    M>Пока что ты продолжаешь называть меня тупым


    ссылку или извинись.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[76]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 10.03.15 13:36
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>Вот я для кого написал "Не будет никакого try_to_change_amount, а будет какой-нть process_order", интересно?

    S>Понятия не имею. Наверное, для тех, кто никогда в жизни не писал системы обработки заказов, и может поверить в эту смелую фантазию.

    хм. Это я никогда не писал, видимо

    S>В приведённых вами примерах ровно никакой пользы нет — код бросает те же исключения в тех же ситуациях. И те ошибки, которые может "отловить" ваш код, в безтиповом коде вообще не возникают от слова "никак".


    В моем коде (на работе, в смысле) вообще исключений нет, в принципе (кроме момента старта приложения, когда всякие конфиги читаются).
    Если что-то запрещено делать — код просто не должен пытаться это сделать (в смысле, должен быть так написан), а не бросаться исключениями на попытку вызвать не то. В HFT исключения на каждый чих — непозволительная роскошь.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[89]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 10.03.15 13:50
    Оценка:
    M>>Это задача из банка. Ты же тут притащил презенетацию из банка про типы. Ты думаешь у них что-то сильно другое?
    J>Уверен. Они риск пишут, а не ордер-процессинг, там же написано.

    Это значит, что у них точно такие же задачи. Ты думаешь, мы риск не пишем? Ты сильно ошибаешься.

    J>>>Ее можно решить как одним мега-свойством IncreaseAmountOK, так и кучей элементарных свойств или какой-то их комбинации.

    J>сорри, не раньше апреля (отпуск, работа). До тех пор могу только односложно отвечать по сути.

    Хорошо, в апреле напомню

    M>>Да. Мне непонятно, как это решить, несмотря на тот кусок кода, что ты привел ПОтому что твой кусок кода не отвечает на вопросы:

    M>>- что будет, когда условий больше двух
    M>>- показать, как типы хорошо помогают при с ad-hoc программировании (твое утверждение, поэтому оно есть в здаче)

    J>Ты ведь понял, как я добавил второе свойство? Сможешь ведь по аналогии добавить третье, четвертое?


    Да. Мне непонятно. Я вижу распухающий от этих типов и PROP_IF'ов код, за которым не видно не то, что леса, но даже того, что вообще в коде происходит. Я зотел бы увидеть законченный код То есть где не только «добавлено третье-четвертое свойство» в тип, но и есть код, который с этими типами работает


    dmitriid.comGitHubLinkedIn
    Re[79]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 10.03.15 13:54
    Оценка:
    M>>Ага. Внезапно тебе уже не нравится логика. Что ты подразумеваешь под словом «логика»?

    J>Какие-то действия. Типа "если а, то делаем б и в, а если г и д — то е". При этом у действий есть конкретные предусловия, которые нарушать нельзя. А у тебя всего одно действие — увеличить amount. На нем можно продемонстрировать подход в общем, но тебя это не устроило


    У меня есть действие increase_amount, у которого есть конкретные предусловия


    J>>>Миллион условий на то, когда можно увеличивать amount?

    M>>Не миллион. Всего четыре (если не ошибаюсь) в моей изначальной задаче.
    J>Ну там же усложнение идет просто за счет добавления условий, навешенных на то же самое действие increase_amount, разве не так?

    у действий есть конкретные предусловия, которые нарушать нельзя.


    Заменяем «действий» на increase_amount, и что принципиально меняется? Ничего.

    Ты начал петь ту же песню, что и Евгений
    Автор: Mamut
    Дата: 05.03.15


    dmitriid.comGitHubLinkedIn
    Re[77]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 11.03.15 03:38
    Оценка:
    Здравствуйте, jazzer, Вы писали:
    J>хм. Это я никогда не писал, видимо
    Ну, я так понял, что приведённый код — это не из продакшн-системы, а фантазии на тему "как бы выглядела бабушка, в случае, если ...".
    Если у вас есть какой-то практический опыт — расскажите. Как вам удаётся написать "развесистую логику" в обработке одного шага workflow? Или вам удалось одной функцией с развесистой логикой описать workflow, который исполняется несколько недель?

    С моей точки зрения, максимум, на что можно рассчитывать в order processing при помощи традиционной типизации — это заставить программиста явно обработать все статусы ордеров. Чтобы не получилось так, что ордер в неожиданном статусе при попытке изменить ему amount ни ошибки не выдаёт, ни amount не меняет.

    J>В моем коде (на работе, в смысле) вообще исключений нет, в принципе (кроме момента старта приложения, когда всякие конфиги читаются).

    J>Если что-то запрещено делать — код просто не должен пытаться это сделать (в смысле, должен быть так написан), а не бросаться исключениями на попытку вызвать не то. В HFT исключения на каждый чих — непозволительная роскошь.
    Золотые слова. Именно это и хочется обеспечить при помощи системы типов.
    К сожалению, пока пути это сделать не видно — по крайней мере, убедительного примера так и не было приведено.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[80]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 11.03.15 11:51
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:
    M>У меня есть действие increase_amount, у которого есть конкретные предусловия
    По такому описанию реально ничего не напишешь.
    В том смысле, что хотелось бы понять — а что предшествует этому increase_amount?
    Это есть такой API, который выставлен наружу, и внешняя система может в произвольный момент времени запросить увеличение amount?
    Или есть какой-то (какие-то) сценарий типа "объединить два ордера", в рамках которого происходит косвенное увеличение amount?
    Или есть workflow для ордеров, который реализован внутри вашей системы, и в рамках этого workflow есть какие-то действия, когда можно увеличить amount?
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[78]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 11.03.15 15:05
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Как вам удаётся написать "развесистую логику" в обработке одного шага workflow? Или вам удалось одной функцией с развесистой логикой описать workflow, который исполняется несколько недель?


    Ну как-то так:
    void next_step(Order& o)
    {
      if (order.state1 == 1)
        do_action1(o);
      else
        if (order.state2 == 2)
          do_action2(o);
        else
        {
          do_action3(o);
          if (o.state3 == 3)
            do_action1(o);
        }
    }


    А как иначе, собственно? Ордер пришел из БД (или по сети), ты не знаешь, куда его можно двинуть дальше, пока не проанализируешь различные его свойства. Где тут место исключениям? Где тут место рантайм-ошибкам, кроме ошибок программиста?
    Ну и да, если workflow исполняется несколько недель, все эти недели функция просто заходит в разные ветки.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[90]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 11.03.15 15:19
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>>>Это задача из банка. Ты же тут притащил презенетацию из банка про типы. Ты думаешь у них что-то сильно другое?

    J>>Уверен. Они риск пишут, а не ордер-процессинг, там же написано.
    M>Это значит, что у них точно такие же задачи. Ты думаешь, мы риск не пишем? Ты сильно ошибаешься.

    Риск — это просто математика же (если мы одно и то же имеем в виду под ним)

    M>>>Да. Мне непонятно, как это решить, несмотря на тот кусок кода, что ты привел ПОтому что твой кусок кода не отвечает на вопросы:

    M>>>- что будет, когда условий больше двух
    M>>>- показать, как типы хорошо помогают при с ad-hoc программировании (твое утверждение, поэтому оно есть в здаче)

    J>>Ты ведь понял, как я добавил второе свойство? Сможешь ведь по аналогии добавить третье, четвертое?


    M>Да. Мне непонятно.

    Непонятно, как я добавлял второе свойство? Если так, то с этого надо было начинать. Что конкретно непонятно?

    M>Я вижу распухающий от этих типов и PROP_IF'ов код, за которым не видно не то, что леса, но даже того, что вообще в коде происходит. Я зотел бы увидеть законченный код То есть где не только «добавлено третье-четвертое свойство» в тип, но и есть код, который с этими типами работает


    распухание ровно такое же, как в случае обычных if. Я специально сделал синтаксис максимально похожим на обычный if.

    Давай так, просто ради смеха и если у тебя есть время, ты возьмешь и добавишь по образцу третье свойство в мой код. Любое, на свой вкус. Что там у нас есть сейчас — HasRisk и Shipped? Вот добавь по аналогии Prepaid (в самом ордере это свойство уже есть: o.prepaid()). А потом расскажешь, что именно показалось трудным.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[79]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 12.03.15 05:51
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Здравствуйте, Sinclair, Вы писали:


    S>>Как вам удаётся написать "развесистую логику" в обработке одного шага workflow? Или вам удалось одной функцией с развесистой логикой описать workflow, который исполняется несколько недель?


    J>Ну как-то так:

    J>
    J>void next_step(Order& o)
    J>{
    J>  if (order.state1 == 1)
    J>    do_action1(o);
    J>  else
    J>    if (order.state2 == 2)
    J>      do_action2(o);
    J>    else
    J>    {
    J>      do_action3(o);
    J>      if (o.state3 == 3)
    J>        do_action1(o);
    J>    }
    J>}
    J>

    Очень странно. Кто вызывает этот "next_step"? По какому событию?
    J>А как иначе, собственно? Ордер пришел из БД (или по сети), ты не знаешь, куда его можно двинуть дальше, пока не проанализируешь различные его свойства.
    Все системы, которые видел я, устроены так, что абстрактного глагола "вперёд" нету. Есть конкретные события: например, pay_order — привязать оплату к ордеру. Это событие переводит ордер в другой статус и, быть может, триггерит другие события. Например, если всё остальное готово, то заказ отправляется в delivery. И спит в этом статусе до тех пор, пока не придёт событие о результатах доставки. Никаким next_step не опишешь разнообразие событий, которые могут произойти после отправки:
    — уведомление от транспортной компании о сбое доставки
    — уведомление от клиента о получении товара
    — отказ клиента от заказа
    — оповещение от банка об отзыве платежа
    Каждое из этих событий влияет на ордер по-разному.

    J> Где тут место исключениям? Где тут место рантайм-ошибкам, кроме ошибок программиста?

    Например, попытка сделать pay_order повторно на уже оплаченный ордер. Если это внешняя система — то байт им судья, могли что угодно накосячить. Но ведь может так оказаться, что мы сами накосячили. У нас в workflow попало два шага request_payment. А из-за асинхронности они попали в разные обработчики событий. То есть эта "рантайм-ошибка" статически неизбежна.
    Именно такие вещи мы и хотим ловить при помощи системы типов.

    J>Ну и да, если workflow исполняется несколько недель, все эти недели функция просто заходит в разные ветки.

    К сожалению, эту функцию обсуждать серъёзно невозможно — она не описывает никакой workflow. В ней действительно нет места исключениям — ровно потому, что они не предусмотрены.
    Если вы замените next_step на обработчик конкретного события, например pay_order(Order &o, Payment &p), то сразу появится и место исключениям — потому что помимо проверок на состояние ордера придётся как-то рапортовать и о том, что оплаченный заказ нельзя оплатить повторно.
    Но в функции pay_order вы вряд ли найдёте развесистую логику, в которой из разных веток вызываются методы, к которым можно придумать нетривиальные предусловия.
    Поэтому банальные проверки бизнес-правил в начале функции, и выброс исключения в случае их нарушения прекрасно сработают и без ввода сложной системы типов.

    Система типов могла бы нам помочь, если бы она обнаруживала такие вещи, как задвоение шага request_payment в какой-то из веток жизненного цикла заказа.
    Но ваша реализация до этого не дотягивает.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[80]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 12.03.15 10:42
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Но в функции pay_order вы вряд ли найдёте развесистую логику, в которой из разных веток вызываются методы, к которым можно придумать нетривиальные предусловия.

    S>Поэтому банальные проверки бизнес-правил в начале функции, и выброс исключения в случае их нарушения прекрасно сработают и без ввода сложной системы типов.

    Все верно. Задача системы типов в данном случае заставить программиста написать эти банальные проверки.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[81]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 12.03.15 18:01
    Оценка:
    Здравствуйте, genre, Вы писали:
    S>>Поэтому банальные проверки бизнес-правил в начале функции, и выброс исключения в случае их нарушения прекрасно сработают и без ввода сложной системы типов.
    G>Все верно. Задача системы типов в данном случае заставить программиста написать эти банальные проверки.
    Не получится. В данном случае — это как порошок от блох, который нужно сыпать в глаза каждой блохе.
    Т.е. сначала программист должен не забыть написать "типы", которые заставят его сделать проверку, а потом должен сделать эту проверку.
    Ему куда проще написать сразу сами проверки.
    Вы попробуйте в качестве упражнения написать мало-мальски реалистичную функцию pay_order(Order o, Payment p). Вы устанете выносить из неё подфункции, которые можно было бы типизировать так, чтобы "заставить программиста написать эти банальные проверки".
    Вот, скажем, близкий к рабочему пример:
    void pay_order(Order o, Payment p)
    {
       
        Assert(o.PaymentStatus != PaymentStatus.Paid, "An order cannot be paid twice. Detach an existing payment from order prior to attaching another payment");
        Assert(p.UsedFor == null, "This payment is already used to pay another order");
        Assert(o.Amount == p.Amount, "Payment amount must exactly match the order amount");
        Assert(p.Status >= Verified, "Only verified payments can be used to pay the orders");
        
        p.UsedFor = o;
        o.Payment = p;
        o.PaymentStatus = PaymentStatus.Paid;
    }

    Покажите, как система типов поможет "заставить программиста написать эти банальные проверки".
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[82]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 12.03.15 18:37
    Оценка: +1
    Здравствуйте, Sinclair, Вы писали:

    S>Т.е. сначала программист должен не забыть написать "типы", которые заставят его сделать проверку, а потом должен сделать эту проверку.

    S>Ему куда проще написать сразу сами проверки.

    Здесь уже несколько раз говорилось — если проверки присутствуют в программе в единственном экземпляре каждая, то, конечно же, писать для них типы бессмысленно.
    А если у вас N проверок и M их комбинаций в разных функциях (которые могут еще и вызывать друг друга) — это совершенно другая ситуация.
    Как часто встречаются подобные ситуации на практике — не знаю. Когда нет удобного инструмента для работы со всем этим (а его нет), то эти ситуации проходят мимо незамеченными.
    Re[83]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 12.03.15 19:06
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>Здесь уже несколько раз говорилось — если проверки присутствуют в программе в единственном экземпляре каждая, то, конечно же, писать для них типы бессмысленно.

    Я ещё раз намекну про то, что ошибку попытки двойного взятия платежа хотелось предотвратить статически.
    Дупа — в том, что "в программе" переходы состояний размазаны по нескольким функциям, которые общаются через нетипизированную базу.
    На первый взгляд я не вижу способа системой типов предотвратить то, что ордер попадает в состояние awaiting_for_payment дважды в разных местах программы.

    ARK>А если у вас N проверок и M их комбинаций в разных функциях (которые могут еще и вызывать друг друга) — это совершенно другая ситуация.

    ARK>Как часто встречаются подобные ситуации на практике — не знаю. Когда нет удобного инструмента для работы со всем этим (а его нет), то эти ситуации проходят мимо незамеченными.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[84]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 12.03.15 20:03
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Я ещё раз намекну про то, что ошибку попытки двойного взятия платежа хотелось предотвратить статически.

    S>Дупа — в том, что "в программе" переходы состояний размазаны по нескольким функциям, которые общаются через нетипизированную базу.
    S>На первый взгляд я не вижу способа системой типов предотвратить то, что ордер попадает в состояние awaiting_for_payment дважды в разных местах программы.

    Ну да, если между изменениями состояния находится нетипизированная база, то — в случае задания предусловий на типах — компилятор вынудит ставить проверки везде после "выхода" из этой базы.
    То есть статически предотвратить двойной платеж можно, но компилятор заставит писать рантайм-проверку перед каждым вызовом pay_order.
    Но не везде ведь есть нетипизированная база. Топик вроде бы носит более общий характер.
    Re[85]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 13.03.15 04:29
    Оценка:
    Здравствуйте, AlexRK, Вы писали:
    ARK>Ну да, если между изменениями состояния находится нетипизированная база, то — в случае задания предусловий на типах — компилятор вынудит ставить проверки везде после "выхода" из этой базы.
    Это в обсуждаемом конкретном подходе. Им типизация не исчерпывается.
    ARK>То есть статически предотвратить двойной платеж можно, но компилятор заставит писать рантайм-проверку перед каждым вызовом pay_order.
    ARK>Но не везде ведь есть нетипизированная база. Топик вроде бы носит более общий характер.
    Ну, я очень удивлюсь, когда увижу типизированную базу с поддержкой хотя бы дженериков .Net, не говоря уже о шаблонах С++. И с поддержкой смены типа персистед объекта.
    А до тех пор всё, что у нас есть для persistence в бизнес-приложениях — это нетипизированные базы.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[86]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 13.03.15 06:32
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    ARK>>Но не везде ведь есть нетипизированная база. Топик вроде бы носит более общий характер.

    S>Ну, я очень удивлюсь, когда увижу типизированную базу с поддержкой хотя бы дженериков .Net, не говоря уже о шаблонах С++. И с поддержкой смены типа персистед объекта.
    S>А до тех пор всё, что у нас есть для persistence в бизнес-приложениях — это нетипизированные базы.

    Я имел в виду, что базы вообще может не быть, программы же разные бывают. Например, в коде современной компьютерной игры много сложной логики.
    Re[87]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 13.03.15 07:21
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    ARK>Я имел в виду, что базы вообще может не быть, программы же разные бывают. Например, в коде современной компьютерной игры много сложной логики.

    Это да. Но в ответ на вопрос "как применить развитую типизацию в системах автоматизации бизнеса" примеры из компьютерных игр не вполне подходят.
    А про устройство игр я, скажем, рассуждать уже совсем неспособен — слишком я далёк от понимания того, как они внутри устроены.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[80]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 13.03.15 07:35
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>>>Как вам удаётся написать "развесистую логику" в обработке одного шага workflow? Или вам удалось одной функцией с развесистой логикой описать workflow, который исполняется несколько недель?


    J>>Ну как-то так:

    J>>
    J>>void next_step(Order& o)
    J>>

    S>Очень странно. Кто вызывает этот "next_step"? По какому событию?

    По таймеру, по изменению окружения (пришла новая market data, случился (возможно) меняющий общий риск трейд, пересчиталась модель и т.п.).
    По свистку, наконец (EOD jobs).

    J>> Где тут место исключениям? Где тут место рантайм-ошибкам, кроме ошибок программиста?

    S>Например, попытка сделать pay_order повторно на уже оплаченный ордер. Если это внешняя система — то байт им судья, могли что угодно накосячить. Но ведь может так оказаться, что мы сами накосячили. У нас в workflow попало два шага request_payment. А из-за асинхронности они попали в разные обработчики событий. То есть эта "рантайм-ошибка" статически неизбежна.
    S>Именно такие вещи мы и хотим ловить при помощи системы типов.

    Можешь разъяснить суть вашего бага? Я пока не очень понял, чтобы предлагать какое-то решение на типах.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[81]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 13.03.15 07:49
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>По таймеру, по изменению окружения (пришла новая market data, случился (возможно) меняющий общий риск трейд, пересчиталась модель и т.п.).

    Ну и где тут у вас информация о том, что за событие произошло? В жизни не поверю, что все эти случаи обрабатывает одна и та же процедура.
    Сейчас даже wndproc так никто не делает — события диспетчеризуются в специфичные обработчики.

    S>>Например, попытка сделать pay_order повторно на уже оплаченный ордер. Если это внешняя система — то байт им судья, могли что угодно накосячить. Но ведь может так оказаться, что мы сами накосячили. У нас в workflow попало два шага request_payment. А из-за асинхронности они попали в разные обработчики событий. То есть эта "рантайм-ошибка" статически неизбежна.

    S>>Именно такие вещи мы и хотим ловить при помощи системы типов.

    J>Можешь разъяснить суть вашего бага? Я пока не очень понял, чтобы предлагать какое-то решение на типах.

    Суть простая — был заказ, его оплатили. Из-за ошибки в логике на одном из шагов (например, обработка оповещения от склада о приходе недостающего товара) запрашивается новый платёж.
    Мы хотим гарантировать простую вещь — чтобы нельзя было оплатить один и тот же заказ дважды.
    При этом мы хотим предотвратить ошибку в логике workflow, а не просто выкинуть messagebox со словами "ой, ваш платёж сюда не засунешь".
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[82]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 13.03.15 08:58
    Оценка: 75 (2)
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, jazzer, Вы писали:


    J>>По таймеру, по изменению окружения (пришла новая market data, случился (возможно) меняющий общий риск трейд, пересчиталась модель и т.п.).

    S>Ну и где тут у вас информация о том, что за событие произошло?
    Нету, а зачем она здесь? Событие может быть глобальным, так что знание его ничего для конкретного ордера не даст.

    S>В жизни не поверю, что все эти случаи обрабатывает одна и та же процедура.

    Как ты там говорил: "Вооот"
    В то, что ты не веришь, я готов поверить, но циферках на своем зарплатном счете я все равно верю больше

    S>Сейчас даже wndproc так никто не делает — события диспетчеризуются в специфичные обработчики.

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

    S>>>Например, попытка сделать pay_order повторно на уже оплаченный ордер. Если это внешняя система — то байт им судья, могли что угодно накосячить. Но ведь может так оказаться, что мы сами накосячили. У нас в workflow попало два шага request_payment. А из-за асинхронности они попали в разные обработчики событий. То есть эта "рантайм-ошибка" статически неизбежна.

    S>>>Именно такие вещи мы и хотим ловить при помощи системы типов.

    J>>Можешь разъяснить суть вашего бага? Я пока не очень понял, чтобы предлагать какое-то решение на типах.

    S>Суть простая — был заказ, его оплатили.
    То есть в БД у ордера взведен флажок "оплачено", так?

    S>Из-за ошибки в логике на одном из шагов (например, обработка оповещения от склада о приходе недостающего товара) запрашивается новый платёж.

    Вот, кстати, отличный пример разветвленной логики, не относящейся к конкретному ордеру. При приходе недостающего товара надо обойти ВСЕ ордера и посмотреть, нет ли в них этого товара, и если есть, то что-то сделать (в т.ч. запросить платеж). Типа
    void goods_arrived(Goods g) {
      for( Order& o: orders_in_db() ) {
        if ( o.contains(g) ) {
          // do lots of stuff: mark arrived goods as available etc...
          request_payment(o);
        }
      }
    }

    S>Мы хотим гарантировать простую вещь — чтобы нельзя было оплатить один и тот же заказ дважды.
    Т.е. предусловие у request_payment — что флажок "оплачено" не должен быть взведен, так?

    S>При этом мы хотим предотвратить ошибку в логике workflow, а не просто выкинуть messagebox со словами "ой, ваш платёж сюда не засунешь".

    Т.е. ошибка (программиста) в том, что он просто вызвал request_payment(o), в то время как надо было сунуть этот вызов под условие if(unpayed(o)) request_payment(o)?
    Т.е. правильный код goods_arrived должен быть таким?
    O request_payment(O o) { ... }
    
    void goods_arrived(Goods g) {
      for( Order& o: orders_in_db() ) {
        if ( o.contains(g) ) {
          // do lots of stuff: mark arrived goods as available etc...
          if ( !payed(o) ) { // <<< вот этот вот if программер забыл
            request_payment(o);
          }
        }
      }
    }


    Если все так, то это один-в-один то, что я описал в своей статье: http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15
    , самый первый пример, только вместо increase_amount будет request_payment, вместо try_to_change_amount будет goods_arrived, ну и свойство будет Payed вместо HasRisk:
    struct Payed;
    
    template<class O>
    typename boost::enable_if< CheckExact< O, Payed, bm::false_ >, O >::type
    request_payment(O o) { ... }
    
    void goods_arrived(Goods g) {
      for( Order& o: orders_in_db() ) {
        if ( o.contains(g) ) {
          // do lots of stuff: mark arrived goods as available etc...
          PROP_IF_NOT( unpayed_o, payed(o), Payed ) { // <<< без вот этого if
            request_payment(unpayed_o);               // <<< эта строчка не скомпилируется
            // (я тут даже переименовал o в unpayed_o для наглядности, хотя можно было и о оставить)
          }
        }
      }
    }

    ну и предыдуший if(o.contains(g)) тоже можно в соответствующий PROP_IF превратить, если под этим if вызывается код, который нельзя звать за его пределами.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[88]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 13.03.15 09:22
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, AlexRK, Вы писали:


    ARK>>Я имел в виду, что базы вообще может не быть, программы же разные бывают. Например, в коде современной компьютерной игры много сложной логики.

    S>Это да. Но в ответ на вопрос "как применить развитую типизацию в системах автоматизации бизнеса" примеры из компьютерных игр не вполне подходят.
    S>А про устройство игр я, скажем, рассуждать уже совсем неспособен — слишком я далёк от понимания того, как они внутри устроены.

    Если честно, не вижу разницы между "сделать что-то со всеми живыми объектами в игре" (скажем, подвинуть их в соответствии с их скоростями) и "сделать что-то со всеми неоплаченными ордерами" (скажем, послать юзерам напоминания, чтоб оплатили)
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[82]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 13.03.15 10:33
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    G>>Все верно. Задача системы типов в данном случае заставить программиста написать эти банальные проверки.

    S>Не получится. В данном случае — это как порошок от блох, который нужно сыпать в глаза каждой блохе.
    S>Т.е. сначала программист должен не забыть написать "типы", которые заставят его сделать проверку, а потом должен сделать эту проверку.
    S>Ему куда проще написать сразу сами проверки.

    Ну все-таки в большинстве систем существует некое ядро вокруг которого пишется функционал, например в торговых системах ордер это базовая сущность, которая пишется один раз, а потом много лет пишутся функции обработки этого самого ордера.


    S>Вы попробуйте в качестве упражнения написать мало-мальски реалистичную функцию pay_order(Order o, Payment p). Вы устанете выносить из неё подфункции, которые можно было бы типизировать так, чтобы "заставить программиста написать эти банальные проверки".



    S>Вот, скажем, близкий к рабочему пример:

    S>
    S>void pay_order(Order o, Payment p)
    S>{
       
    S>    Assert(o.PaymentStatus != PaymentStatus.Paid, "An order cannot be paid twice. Detach an existing payment from order prior to attaching another payment");
    S>    Assert(p.UsedFor == null, "This payment is already used to pay another order");
    S>    Assert(o.Amount == p.Amount, "Payment amount must exactly match the order amount");
    S>    Assert(p.Status >= Verified, "Only verified payments can be used to pay the orders");
        
    S>    p.UsedFor = o;
    S>    o.Payment = p;
    S>    o.PaymentStatus = PaymentStatus.Paid;
    S>}
    S>

    S>Покажите, как система типов поможет "заставить программиста написать эти банальные проверки".

    Сложно обсуждать такой пример в отрыве от полных требований к системе. Первый вариант которых приходит в голову это вынести все что описано в ассертах на уровень выше и с помощью PROP_IF заставить программиста сделать проверки до вызова pay_order.

    Вообще, подобные проверки будут иметь смысл в системе в которой есть некая базовая сущность и базовые операции над ней из которых потом складывается бизнес-логика. Тогда эти базовые вещи реализуются с подобными проверками и в дальнейшем программисты не забудут написать проверки, если же базовых операций нет (ну или они выглядят как order.amount+=10) то конечно это все не имеет смысла.

    Вот еще пара примеров когда система типов помогает жить.

    1. Я уже приводил этот пример. Борьба с NPE:
    До:
    public void process(Order o){
    // программисты любят забыть эту проверку
    //  if (o == null) throw ...
    o.amount += 10; .. //ой

    После:
    public void process(Optiona<Order> o){
    o.amount += 10; .. //не скомпилировалось


    2. Типы в чистом виде, без извратов:
    order.amount = 10.usd + 10.eur  // не скомпилировалось
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[91]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 16.03.15 12:34
    Оценка:
    J>Давай так, просто ради смеха ... ты возьмешь и добавишь

    Давай так. Просто ради смеха. Ты возьмешь и решишь эту задачу с начала и до конца?


    dmitriid.comGitHubLinkedIn
    Re[81]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 16.03.15 12:34
    Оценка:
    M>>У меня есть действие increase_amount, у которого есть конкретные предусловия
    S>По такому описанию реально ничего не напишешь.
    S>В том смысле, что хотелось бы понять — а что предшествует этому increase_amount?

    А, собственно, зачем?

    S>Это есть такой API, который выставлен наружу, и внешняя система может в произвольный момент времени запросить увеличение amount?

    S>Или есть какой-то (какие-то) сценарий типа "объединить два ордера", в рамках которого происходит косвенное увеличение amount?
    S>Или есть workflow для ордеров, который реализован внутри вашей системы, и в рамках этого workflow есть какие-то действия, когда можно увеличить amount?


    А зачем это знать для данной конкретной задачи?


    dmitriid.comGitHubLinkedIn
    Re[83]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 16.03.15 12:39
    Оценка: -1 :))
    G>1. Я уже приводил этот пример. Борьба с NPE:
    G>До:
    G>
    G>public void process(Order o){
    G>// программисты любят забыть эту проверку
    G>//  if (o == null) throw ...
    G>o.amount += 10; .. //ой
    G>

    G>После:
    G>
    G>public void process(Optiona<Order> o){
    G>o.amount += 10; .. //не скомпилировалось
    G>



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


    dmitriid.comGitHubLinkedIn
    Re[82]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 17.03.15 05:34
    Оценка:
    Здравствуйте, Mamut, Вы писали:
    M>А, собственно, зачем?

    M>А зачем это знать для данной конкретной задачи?

    Потому, что без этого невозможно понять, что можно повторно использовать, и где можно получить выигрыш на однократной проверке вместо многократных.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[83]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 17.03.15 09:44
    Оценка: :)
    M>>А, собственно, зачем?

    M>>А зачем это знать для данной конкретной задачи?

    S>Потому, что без этого невозможно понять, что можно повторно использовать, и где можно получить выигрыш на однократной проверке вместо многократных.


    Так как задача достаточно изолированна, то можно придумать себе какие угодно условия. Попробовать и так и так Как видим, пока проблема в том, что ни у кого не получается ничего придумать


    dmitriid.comGitHubLinkedIn
    Re[84]: Haskell нужен! (в Standard Chartered Bank)
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 18.03.15 08:38
    Оценка:
    Здравствуйте, Mamut, Вы писали:
    M>Так как задача достаточно изолированна, то можно придумать себе какие угодно условия. Попробовать и так и так Как видим, пока проблема в том, что ни у кого не получается ничего придумать
    Ну, это уже выходит игра в одни ворота. Загадывающий всегда выигрывает, т.к. может додумать доп.условия, конфликтующие с любым предложенным решением.
    А если от этого произвола отказаться, то задача уже решена:
    1. Вводим два типа ордеров: OrderThatAllowsIncreasingAmount и Order
    2. Реализуем EnsureOrderAllowsIncreasingAmount() — оператор конверсии из второго в первый, который делает 18 проверок и выкидывает исключение, если что-то пошло не так.
    3. Придумываем себе условия, при которых increase_amount вызывается 500 раз из различных мест. Например, из метода MergeNewOrderIntoAPreviousOrder.
    Убеждаемся, что компилятор обязывает нас либо вставить оператор конверсии прямо в этот метод, либо заменить тип аргумента с Order на OrderThatAllowsIncreasingAmount, подчёркивая тот факт, что в "залоченный" ордер мы ничего добавить не можем.
    Убеждаемся, что теперь компилятор не пропускает код вида:
    public void HandleDelivery(Order newOrder)
    {
       var previousOrder = GetExistingCustomerOrders(newOrder.Customer).FirstOrDefault();
       if (previousOrder != null)
       {
         MergeNewOrderIntoAPreviousOrder(previousOrder, newOrder); // ARRGH! there is no implicit conversion from Order to OrderThatAllowsIncreasingAmount
         SubmitforDelivery(previousOrder);
       }
       else
         SubmitForDelivery(newOrder);
       
    }

    Это сразу подсказывает нам переписать код вот так:
    public void HandleDelivery(Order newOrder)
    {
       var previousOrder = GetExistingCustomerOrdersAllowedForAmountIncrease(newOrder.Customer).FirstOrDefault();
       if (previousOrder != null)
       {
         MergeNewOrderIntoAPreviousOrder(previousOrder, newOrder); // Compiler's happy
         SubmitforDelivery(previousOrder);
       }
       else
         SubmitForDelivery(newOrder);
       
    }

    В бестиповом аналоге первый вариант HandleDelivery мог бы успешно уехать в продакшн — потому что вылет исключения случается не каждый раз, а только тогда, когда у кастомера есть предыдущие ордера, и наугад выбранный один из них подпал под одно из 18 условий.
    То, что программист может на всё наплевать, и исправить код вот так, выходит за рамки технических решений:
    public void HandleDelivery(Order newOrder)
    {
       var previousOrder = GetExistingCustomerOrders(newOrder.Customer).FirstOrDefault();
       if (previousOrder != null)
       {
         MergeNewOrderIntoAPreviousOrder(EnsureOrderAllowsIncreasingAmount(previousOrder), newOrder); // ARRGH! Runtime exception.
         SubmitforDelivery(previousOrder);
       }
       else
         SubmitForDelivery(newOrder);
       
    }
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[85]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 18.03.15 17:55
    Оценка:
    M>>Так как задача достаточно изолированна, то можно придумать себе какие угодно условия. Попробовать и так и так Как видим, пока проблема в том, что ни у кого не получается ничего придумать
    S>Ну, это уже выходит игра в одни ворота. Загадывающий всегда выигрывает, т.к. может додумать доп.условия, конфликтующие с любым предложенным решением.

    Да, безусловно. Но от этого становится только интереснее — можно протестировать границы применимости предлагаемых подходов

    S>А если от этого произвола отказаться, то задача уже решена:

    S>1. Вводим два типа ордеров: OrderThatAllowsIncreasingAmount и Order
    S>2. Реализуем EnsureOrderAllowsIncreasingAmount() — оператор конверсии из второго в первый, который делает 18 проверок и выкидывает исключение, если что-то пошло не так.

    Можно, пожалуйста, дать мне ссылку, где эта задача решена на этом форуме А то все говорят про «OrderThatAllowsIncreasingAmount» и про «ну там же очевидно как реализовать 18 проверок», но так никто не показал ни одного куска законченного кода


    Все остальное скипнуто, потому что оно ничем не отличается от пафосных заявлений в сотне сообщений


    dmitriid.comGitHubLinkedIn
    Отредактировано 18.03.2015 17:56 Mamut [ищите в других сетях] . Предыдущая версия .
    Re[84]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 19.03.15 15:33
    Оценка:
    Здравствуйте, Mamut, Вы писали:


    M>И все просто бегают как огня ответа на вопрос, что будет, когда там будет не просто Optional, не скомпилировалось, а два-три-пять-да хоть пятндацать условий. Код так никто и не осилил, щато внезапно примеры оказываются неправильными, или просто на словах рассказывается, как все будет легко и прекрасно


    Тебя заело. Сто раз уже сказали, что проверить рантайм значение в компайл-тайм невозможно. Можно лишь форсировать проверку.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[85]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 19.03.15 17:32
    Оценка:
    M>>И все просто бегают как огня ответа на вопрос, что будет, когда там будет не просто Optional, не скомпилировалось, а два-три-пять-да хоть пятндацать условий. Код так никто и не осилил, щато внезапно примеры оказываются неправильными, или просто на словах рассказывается, как все будет легко и прекрасно

    G>Тебя заело. Сто раз уже сказали, что проверить рантайм значение в компайл-тайм невозможно. Можно лишь форсировать проверку.


    /o\

    Что такое «форсировать проверку»?


    dmitriid.comGitHubLinkedIn
    Re[86]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 23.03.15 10:19
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Что такое «форсировать проверку»?


    заставить программиста ее сделать
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[92]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 23.03.15 12:11
    Оценка: +2
    Здравствуйте, Mamut, Вы писали:


    J>>Давай так, просто ради смеха ... ты возьмешь и добавишь


    M>Давай так. Просто ради смеха. Ты возьмешь и решишь эту задачу с начала и до конца?


    Ну вот и как я должен после этого относиться к твоим заявлениям, что ты мою статью прочитал и разобрался? Ты тут громко возмущаешься, что люди не хотят тратить время, чтобы решать ВСЮ твою задачу, но при этом сам не хочешь попробовать даже всего ОДНО свойство добавить по моему образцу?


    Давай я еще раз задам вопросы, котрые ты стер — у тебя не займет много времени на них ответить:

    Непонятно, как я добавлял второе свойство? Если так, то с этого надо было начинать. Что конкретно непонятно?


    Ну и до кучи

    M>Пока что ты продолжаешь называть меня тупым

    ссылку или извинись.

    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[93]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 14:02
    Оценка: -1 :)
    J>>>Давай так, просто ради смеха ... ты возьмешь и добавишь
    M>>Давай так. Просто ради смеха. Ты возьмешь и решишь эту задачу с начала и до конца?
    J>Ну вот и как я должен после этого относиться к твоим заявлениям, что ты мою статью прочитал и разобрался?

    Какой из моих вопросов тебе непонятен?

    J>Ты тут громко возмущаешься, что люди не хотят тратить время, чтобы решать ВСЮ твою задачу, но при этом сам не хочешь попробовать даже всего ОДНО свойство добавить по моему образцу?


    Ты не собираешься решать даже первый пункт из моей задачи, отмазываясь общими фразами о том, как все будет хорошо. Почему я должен отвечать на твои встречные вопросы и решать твои задачи?

    J>Давай я еще раз задам вопросы, котрые ты стер — у тебя не займет много времени на них ответить:

    J>

    J>Непонятно, как я добавлял второе свойство? Если так, то с этого надо было начинать. Что конкретно непонятно?


    Я пять раз задал тебе один и тот же вопрос. Ты так и не осилил ни ответить на него, ни привести свое решение.

    J>Ну и до кучи

    J>

    M>>Пока что ты продолжаешь называть меня тупым

    J>ссылку или извинись.



    Все твои отсылки к своей «статье», в которой якобы все описано, в ответ на любые мои вопросы.


    dmitriid.comGitHubLinkedIn
    Re[87]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 14:03
    Оценка:
    M>>Что такое «форсировать проверку»?

    G>заставить программиста ее сделать


    Можено увидеть, наконец, это в виде полного законченного решения?


    dmitriid.comGitHubLinkedIn
    Re[88]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 23.03.15 14:35
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    G>>заставить программиста ее сделать

    M>Можено увидеть, наконец, это в виде полного законченного решения?

    ты уже столько раз повторил эту мантру, что лучше бы это время потратил на написание этого самого решения.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[89]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 14:51
    Оценка: -1 :)
    G>>>заставить программиста ее сделать
    M>>Можено увидеть, наконец, это в виде полного законченного решения?

    G>ты уже столько раз повторил эту мантру, что лучше бы это время потратил на написание этого самого решения.


    Стоп. Мантры повторяют исключительно мои оппоненты. Ты в том числе. Я просто последовательно прошу одного: подтвердите свои мантры кодом. Вот покажи, пожалуйста, как ты будешь «форсировать проверку» (твои слова, не мои).

    Пока что от вас от всех очень много слов и 0 дела. Особенно смешно, когда на стопятидесятом сообщении про то, как все очевидно, и программисты форсируются и прочая и прочая внезапно оказывается, что и пример не тот, и задача не та и т.п.

    Тут рядом
    Автор: jazzer
    Дата: 11.03.15
    jazzer уже даже пытается спихнуть «очевидное» решение на меня



    dmitriid.comGitHubLinkedIn
    Re[90]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 23.03.15 15:13
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Пока что от вас от всех очень много слов и 0 дела. Особенно смешно, когда на стопятидесятом сообщении про то, как все очевидно, и программисты форсируются и прочая и прочая внезапно оказывается, что и пример не тот, и задача не та и т.п.


    0 дела? А пример с PROP_IF ты пропустил?
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[91]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 15:48
    Оценка:
    Здравствуйте, genre, Вы писали:

    G>Здравствуйте, Mamut, Вы писали:


    M>>Пока что от вас от всех очень много слов и 0 дела. Особенно смешно, когда на стопятидесятом сообщении про то, как все очевидно, и программисты форсируются и прочая и прочая внезапно оказывается, что и пример не тот, и задача не та и т.п.


    G>0 дела? А пример с PROP_IF ты пропустил?


    В котором 2 условия, и на все вопросы «а как это будет выглядеть на полном примере» я слышу только «ну там очевидно» и прочее?


    dmitriid.comGitHubLinkedIn
    Re[92]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 23.03.15 16:34
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>В котором 2 условия, и на все вопросы «а как это будет выглядеть на полном примере» я слышу только «ну там очевидно» и прочее?


    Ну так может вместо того, чтобы раз за разом требовать этого от других, возмешь и попробуешь сам?
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[93]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 17:01
    Оценка: -2
    M>>В котором 2 условия, и на все вопросы «а как это будет выглядеть на полном примере» я слышу только «ну там очевидно» и прочее?
    G>Ну так может вместо того, чтобы раз за разом требовать этого от других, возмешь и попробуешь сам?

    Вот смотри. Я свою задачу выложил
    Автор: Mamut
    Дата: 05.02.15
    пятого февраля. Полтора месяца тому назад. За полтора месяца мы в нашей команде решили реальную
    Автор: Mamut
    Дата: 06.02.15
    задачу и покрыли её на 100% юнит-тестами и на 100% интеграционными тестами.

    За такие же полтора месяца весь коллективный разум РСДН не смог родить не то что решение к реальной задаче, и даже не то что решение к сильно упрощенной моей задаче, а даже к первому пункту моей упрощенной задачи.

    Это несмотря на неоднократно заявляемые «там тривиально», «там очевидно», «да ты что, типы будут форсировать программиста», «типы помогают при ad-hoc программировании», «банить неправильные условия» и т.п.

    Максимум, что коллективный разум смог родить, это неполные, обычно ограниченные двумя условиями, решения с неизменным «ну дальше все понятно».

    Понимаешь? Я уже даже иду на то, что я уже не требую полного решения всей задаче. Я вполне согласен, чтобы хоть кто-то решил хотя бы первый пункт этой задачи. Что в ответ? «Что тебе непонятно», «реши сам», «это не логика»

    Ты хочешь, чтобы я сам решил свою же задачу? Я ее решил
    Автор: Mamut
    Дата: 06.02.15
    , основываясь строго на условиях, которые привел в изначальной задаче. Решение некрасивое, и к нему много нареканий, и это вполне можно обсуждать.

    Что я вижу с вашей стороны? Приведи мне ссылку на решение, которые полностью решает хотя бы первый пункт из моей задачи. Да-да, той самой «тривиальной», «там все очевидно», «форсировать программиста», «можно легко перевести рантайм данные в компайл-тайм проверки» и т.п. задачи. Ты не сможешь, потому что никто не смог решить даже первый пункт, несмотря на все заявления. Но я почему-то должен слепо верить вам, что все ваши заявления (разной степени пафосности) прекрасно сработают для реальной задачи. Хотя вы реальную задачу не решите вообще никогда.


    dmitriid.comGitHubLinkedIn
    Re[94]: Haskell нужен! (в Standard Chartered Bank)
    От: genre Россия  
    Дата: 23.03.15 18:18
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Что я вижу с вашей стороны? Приведи мне ссылку на решение, которые полностью решает хотя бы первый пункт из моей задачи. Да-да, той самой «тривиальной», «там все очевидно», «форсировать программиста», «можно легко перевести рантайм данные в компайл-тайм проверки» и т.п. задачи. Ты не сможешь, потому что никто не смог решить даже первый пункт, несмотря на все заявления. Но я почему-то должен слепо верить вам, что все ваши заявления (разной степени пафосности) прекрасно сработают для реальной задачи. Хотя вы реальную задачу не решите вообще никогда.


    ну так тебе дали чайник, плиту, коробок спичек и инструкцию как вскипятить воду, а ты все еще чем-то недоволен. все кроме тебя удовлетворились и естественно всем лень тратить время на работающий пример.

    я на с++ сто лет не писал, компилятора у меня под рукой нет и возиться я не буду. А тебе, что мешает, раз уж так хочется взять пример про PROP_IF, скопипастить пропертю can_increase_amount, переименовать ее, добавить получившуюся в шаблон enable_if и получить почти работающий пример с двумя проверками?
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[95]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 18:25
    Оценка: :)
    G>ну так тебе дали чайник, плиту, коробок спичек и инструкцию как вскипятить воду, а ты все еще чем-то недоволен.

    Демагогия

    G>все кроме тебя удовлетворились и естественно всем лень тратить время на работающий пример.


    Не осилили. За полтора месяца — только демагогия и пафос.


    G>я на с++ сто лет не писал, компилятора у меня под рукой нет и возиться я не буду. А тебе, что мешает, раз уж так хочется взять пример про PROP_IF, скопипастить пропертю can_increase_amount, переименовать ее, добавить получившуюся в шаблон enable_if и получить почти работающий пример с двумя проверками?


    «там все очевидно» ©
    «почти работающий пример» ©
    «с двумя проверками» ©

    Процитирую сам себя

    Максимум, что коллективный разум смог родить, это неполные, обычно ограниченные двумя условиями, решения с неизменным «ну дальше все понятно».





    Раз это так просто и тривиально, что же никто так и не смог ни скопипастить ни получить пример даже для одного пункта из моей задачи.


    dmitriid.comGitHubLinkedIn
    Re[95]: Ах, да
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 18:27
    Оценка:
    G>я на с++ сто лет не писал, компилятора у меня под рукой нет и возиться я не буду. А тебе, что мешает, раз уж так хочется взять пример про PROP_IF

    Я тоже на с++ сто лет не писал, и компилятора у меня под рукой нет. Но почему-то именно я должен возиться и почему-то мне внезапно хочется взять пример с PROP_IF

    Это звиздец какой-то.


    dmitriid.comGitHubLinkedIn
    Re[95]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 23.03.15 18:31
    Оценка: +3
    Здравствуйте, genre, Вы писали:

    G>ну так тебе дали чайник, плиту, коробок спичек и инструкцию как вскипятить воду, а ты все еще чем-то недоволен. все кроме тебя удовлетворились и естественно всем лень тратить время на работающий пример.


    Кстати, а откуда вообще всплыла "задача Мамута"? Топик вообще не про это. В чем причина, что все пытаются непонятно чего и зачем доказать? Кому надо и интересно, всё поняли. Мамуту не надо, он продолжает писать на Эрланге. Все довольны.
    Re[96]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 18:49
    Оценка:
    G>>ну так тебе дали чайник, плиту, коробок спичек и инструкцию как вскипятить воду, а ты все еще чем-то недоволен. все кроме тебя удовлетворились и естественно всем лень тратить время на работающий пример.

    ARK>Кстати, а откуда вообще всплыла "задача Мамута"?


    Задача Мамут всплыла от Мамута, потому что:

    — изначально была презентация про Хаскель из банка. Я привел типичную задачу из банка
    — мне все уши прожужжали, как прекрасно типы помогают тут там здесь и вообще, я просто свел воедино несколько таких утверждений в одну задачу (там недаром 3 шага)

    Выросла задача из обсуждения здесь, выше
    Автор: Mamut
    Дата: 03.02.15
    по ветке.

    ARK>Топик вообще не про это. В чем причина, что все пытаются непонятно чего и зачем доказать? Кому надо и интересно, всё поняли. Мамуту не надо


    Мамуту надо. В частности, понять и увидеть как все пафосные заявления работают на полноценном примере, где больше, чем два условия. За полтора месяца — сотня страниц разговоров, ноль решений. Но да, я, видимо, должен проникнуться и поверить, что все это прекрасно работает на гораздо более сложных примерах, ага. Хотя недавно ВНЕЗАПНО jazzer заявил, что у меня в примере нет логики
    Автор: jazzer
    Дата: 08.03.15
    , ага-ага


    dmitriid.comGitHubLinkedIn
    Re[97]: Haskell нужен! (в Standard Chartered Bank)
    От: AlexRK  
    Дата: 23.03.15 19:08
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Задача Мамут всплыла от Мамута, потому что:

    M>- изначально была презентация про Хаскель из банка. Я привел типичную задачу из банка
    M>- мне все уши прожужжали, как прекрасно типы помогают тут там здесь и вообще, я просто свел воедино несколько таких утверждений в одну задачу (там недаром 3 шага)
    M>Выросла задача из обсуждения здесь, выше
    Автор: Mamut
    Дата: 03.02.15
    по ветке.


    Понятно. Думаю, что пора уже завязывать с этой задачей. Ну или выделять в отдельную тему, для тех, кому это интересно. Топик вообще не об этом.

    M>Мамуту надо. В частности, понять и увидеть как все пафосные заявления работают на полноценном примере, где больше, чем два условия.


    Раз надо Мамуту, значит Мамут и должен приложить усилия. Вроде так.

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

    M>Но да, я, видимо, должен проникнуться и поверить, что все это прекрасно работает на гораздо более сложных примерах, ага.


    Абсолютно не должен. Но должен понимать, что из того факта, что никто не привел "полноценный пример", ничего не следует.
    Re[98]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 23.03.15 19:23
    Оценка:
    M>>Мамуту надо. В частности, понять и увидеть как все пафосные заявления работают на полноценном примере, где больше, чем два условия.

    ARK>Раз надо Мамуту, значит Мамут и должен приложить усилия. Вроде так.


    Я уже полтора месяца прикладываю усилия.

    M>>Но да, я, видимо, должен проникнуться и поверить, что все это прекрасно работает на гораздо более сложных примерах, ага.

    ARK>Абсолютно не должен. Но должен понимать, что из того факта, что никто не привел "полноценный пример", ничего не следует.

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


    dmitriid.comGitHubLinkedIn
    Re[96]: Ах, да
    От: genre Россия  
    Дата: 24.03.15 10:11
    Оценка:
    Здравствуйте, Mamut, Вы писали:


    M>Я тоже на с++ сто лет не писал, и компилятора у меня под рукой нет. Но почему-то именно я должен возиться и почему-то мне внезапно хочется взять пример с PROP_IF


    ну потому что именно ты хочешь получить работающий пример
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[97]: Ах, да
    От: Mamut Швеция http://dmitriid.com
    Дата: 24.03.15 10:35
    Оценка:
    M>>Я тоже на с++ сто лет не писал, и компилятора у меня под рукой нет. Но почему-то именно я должен возиться и почему-то мне внезапно хочется взять пример с PROP_IF

    G>ну потому что именно ты хочешь получить работающий пример


    Да, я действительно хочу увидеть работающий пример с больше, чем двумя условиями. Ты уж извини, но это я не я постоянно говорю о «форсироании программистов», «помощи при ад-хок изменении требований» и прочая и прочая и прочая. Но почему-то за полтора месяца разговоров я вижу только разговоры

    Причем мои вопросы остаются неизменными. По сути, с самого начала я задавал два вопроса:
    http://rsdn.ru/forum/philosophy/5942556.1
    Автор: Mamut
    Дата: 03.02.15


    Как это ты все распилишь на типах? И когда распилишь, какого объема будут эти типы, и как их дебажить на предмет логических ошибок?


    Это было третьего февраля. С тех пор все крутится вокруг одного и того же, что я описал (не в первый раз, опять же) тут
    Автор: Mamut
    Дата: 23.03.15
    .


    ЗЫ. Интересно, что вначале ты, по сути, говорил
    Автор: genre
    Дата: 04.02.15
    то же
    Автор: genre
    Дата: 04.02.15
    , что и я


    dmitriid.comGitHubLinkedIn
    Re[98]: Ах, да
    От: genre Россия  
    Дата: 24.03.15 11:07
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Это было третьего февраля. С тех пор все крутится вокруг одного и того же, что я описал (не в первый раз, опять же) тут
    Автор: Mamut
    Дата: 23.03.15
    .


    Если ты внимательно перечитаешь топик, то увидишь ответы на все вопросы. Тебе поэтому никто пример и не приводит, потому что все узнали все, что хотели и дальше возиться лень.

    M>ЗЫ. Интересно, что вначале ты, по сути, говорил
    Автор: genre
    Дата: 04.02.15
    то же
    Автор: genre
    Дата: 04.02.15
    , что и я


    Я и сейчас так говорю. Ты похоже просто уже запутался в том, кто, что утверждает. Идет обсуждение сразу нескольких вопросов, теоретической возможности и практической применимости. Твои оппоненты о теории, ты о практике. Если ты пройдешься по сообщениям, то увидишь, что:
    — Некоторый класс ошибок отловить можно (1.eur + 1.usd)
    — Заставить программиста сделать необходимые проверки можно (Optional и PROP_IF)
    — Лично я считаю, что PROP_IF в банковском софте себя не окупит. А вот что-то типа Optional и типизированных валют/счетов вполне может быть полезно.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[99]: Haskell нужен! (в Standard Chartered Bank)
    От: m.aksenov Россия http://maksenov.info/
    Дата: 24.03.15 11:21
    Оценка: 21 (1)
    Здравствуйте, Mamut, Вы писали:

    M>>>Мамуту надо. В частности, понять и увидеть как все пафосные заявления работают на полноценном примере, где больше, чем два условия.


    ARK>>Раз надо Мамуту, значит Мамут и должен приложить усилия. Вроде так.


    M>Я уже полтора месяца прикладываю усилия.


    M>>>Но да, я, видимо, должен проникнуться и поверить, что все это прекрасно работает на гораздо более сложных примерах, ага.

    ARK>>Абсолютно не должен. Но должен понимать, что из того факта, что никто не привел "полноценный пример", ничего не следует.

    M>То, что за полтора месяца мне рассказали тучу офигительных историй, и ничего больше, можно сделать много выводов.


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

    То есть из наборов условий мы получим портянки преобразований типов в духе RawOrder -> CheckedOrder -> PaidOrder -> CompletedOrder. Лучше ли это? А черт его знает.
    Re[99]: Ах, да
    От: Mamut Швеция http://dmitriid.com
    Дата: 24.03.15 16:40
    Оценка:
    G>Я и сейчас так говорю. Ты похоже просто уже запутался в том, кто, что утверждает. Идет обсуждение сразу нескольких вопросов, теоретической возможности и практической применимости. Твои оппоненты о теории, ты о практике. Если ты пройдешься по сообщениям, то увидишь, что:

    В том-то и дело, что мои оппоненты говорят строго и сугубо о теории. Об этом я тоже не раз говорил. Как только переходим к практике (а теория без практики мертва, не так ли?), как все — тишина, и мертвые с косами стоят

    G>- Некоторый класс ошибок отловить можно (1.eur + 1.usd)

    G>- Заставить программиста сделать необходимые проверки можно (Optional и PROP_IF)
    G>- Лично я считаю, что PROP_IF в банковском софте себя не окупит. А вот что-то типа Optional и типизированных валют/счетов вполне может быть полезно.

    Можно это наконец-то увидеть на реальных примерах? Ну, достаточно полноценных, и чтобы там было больше двух условий?


    dmitriid.comGitHubLinkedIn
    Re[100]: Ах, да
    От: genre Россия  
    Дата: 24.03.15 17:10
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    G>>- Некоторый класс ошибок отловить можно (1.eur + 1.usd)

    G>>- Заставить программиста сделать необходимые проверки можно (Optional и PROP_IF)
    G>>- Лично я считаю, что PROP_IF в банковском софте себя не окупит. А вот что-то типа Optional и типизированных валют/счетов вполне может быть полезно.

    M>Можно это наконец-то увидеть на реальных примерах? Ну, достаточно полноценных, и чтобы там было больше двух условий?


    нет. предлагаю считать, что это все невозможно.
    ... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
    Re[100]: Haskell нужен! (в Standard Chartered Bank)
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 24.03.15 21:10
    Оценка:
    Здравствуйте, m.aksenov, Вы писали:


    MA>То есть из наборов условий мы получим портянки преобразований типов в духе RawOrder -> CheckedOrder -> PaidOrder -> CompletedOrder. Лучше ли это? А черт его знает.

    А если это будут mixins, типа Order<Order.Raw> -> Order<Order.Checked> итд?
    Писать такое руками гемор еще тот, но нагенерить по метаинформации можно. Списки типов в C++ или продвинутые макросы не помогут такое реализовать?

    Базовая проблема в том, что в программе в явном виде отсутствует ЖЦ ордера, поэтому компилятор не может ничем помочь.
    Re[101]: Haskell нужен! (в Standard Chartered Bank)
    От: m.aksenov Россия http://maksenov.info/
    Дата: 25.03.15 03:16
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>Здравствуйте, m.aksenov, Вы писали:



    MA>>То есть из наборов условий мы получим портянки преобразований типов в духе RawOrder -> CheckedOrder -> PaidOrder -> CompletedOrder. Лучше ли это? А черт его знает.

    G>А если это будут mixins, типа Order<Order.Raw> -> Order<Order.Checked> итд?
    G>Писать такое руками гемор еще тот, но нагенерить по метаинформации можно. Списки типов в C++ или продвинутые макросы не помогут такое реализовать?

    G>Базовая проблема в том, что в программе в явном виде отсутствует ЖЦ ордера, поэтому компилятор не может ничем помочь.


    Можно попробовать сделать миксины, но по сути это будет то же самое. Еще интересно как персистентность в таком случае организовывать. То есть, как определять состояние заказа: по атрибутам или по тегу типа в реляционной модели? Если по атрибутам, то нужен будет код, который возвращает по набору атрибутов корректный тип заказа, а значит и выполняет все проверки, прогоняя цепочку преобразований снова. Если по тегу типа, то такой проблемы нет, но модель будет загрязняться дополнительным отношением. А если правила изменились с момента сохранения правила в базу? Например, какая-то базовая ставка повысилась? В общем, больше вопросов, чем ответов.

    Дело вот в чем — имея мощные инструменты метапрограммирования можно нагенерировать кода и на динамике, так как кодогенерация типизации ортогональна. То есть я могу взять ту же Clojure, написать макры и eDSL, который в кложе получается естественным образом, и работать. Сложность проверок уйдет просто на другой уровень — на создание макроописаний. Более того, можно подцепить интересные штуки типа clara для описания бизнес-логики (примеры).
    Re[101]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 25.03.15 05:03
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>А если это будут mixins, типа Order<Order.Raw> -> Order<Order.Checked> итд?


    G>Писать такое руками гемор еще тот, но нагенерить по метаинформации можно. Списки типов в C++ или продвинутые макросы не помогут такое реализовать?

    У меня именно это и реализовано: http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15


    G>Базовая проблема в том, что в программе в явном виде отсутствует ЖЦ ордера, поэтому компилятор не может ничем помочь.

    Это о чем?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[101]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 25.03.15 14:45
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>А если это будут mixins, типа Order<Order.Raw> -> Order<Order.Checked> итд?

    G>Писать такое руками гемор еще тот, но нагенерить по метаинформации можно. Списки типов в C++ или продвинутые макросы не помогут такое реализовать?

    Да всё без проблем реализуется. Тут вопрос в другом. Если мы возьмём исключительно задачу вида "загрузить из БД, сделать одну элементарную операцию, сохранить в БД" (а именно на таком случае стал настаивать Mamut после того, как ему продемонстрировали эффективность работы для других случаев), то смысла в этом особого не будет. Потому как это получится просто перекидывание проверок в другое место исходников. Более того, такой код может даже хуже получиться (но всё равно без проблем реализуемо! Только вот зачем...) из-за большей многословности и размазывания проверок по разным местам, вместо одной компактной функции. И совсем другая ситуация получается, если в нашей задаче будет не одна элементарная операция, а некая последовательность операций. В этом случае проверки останутся только на входе в цепочку операций, а дальше корректность обеспечит система типов (причём с гарантией). В этом случае использование статической типизации может принести сразу несколько бонусов: и гарантированная корректность и уменьшение числа проверок в рантайме. Однако Mamut (да и Sinclair вслед за ними) уже не хотят рассматривать такую задачу, а настаивают на демонстрации преимуществ статической типизации исключительно для ситуации "одна элементарная операций (с кучей предусловий) в транзакции". )))
    Re[102]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 25.03.15 15:23
    Оценка:
    _>Да всё без проблем реализуется. Тут вопрос в другом. Если мы возьмём исключительно задачу вида "загрузить из БД, сделать одну элементарную операцию, сохранить в БД" (а именно на таком случае стал настаивать Mamut после того, как ему продемонстрировали эффективность работы для других случаев)

    Для каких «других» случаев? Никто ничего не продемонстрировал


    _>И совсем другая ситуация получается, если в нашей задаче будет не одна элементарная операция, а некая последовательность операций.


    Ой. Ты не поверишь. В моей задачи есть таки последовательность операций.

    _>В этом случае проверки останутся только на входе в цепочку операций, а дальше корректность обеспечит система типов (причём с гарантией).


    Ну, примеры, примеры где?

    _>В этом случае использование статической типизации может принести сразу несколько бонусов: и гарантированная корректность и уменьшение числа проверок в рантайме. Однако Mamut (да и Sinclair вслед за ними) уже не хотят рассматривать такую задачу, а настаивают на демонстрации преимуществ статической типизации исключительно для ситуации "одна элементарная операций (с кучей предусловий) в транзакции". )))



    Ну покажи пример неэлементарной операции Мы готовы рассматривать любые случаи, любые операции. Только вот никто не показывает Все упирается в два условия и «а дальше все понятно»


    dmitriid.comGitHubLinkedIn
    Re[102]: Haskell нужен! (в Standard Chartered Bank)
    От: m.aksenov Россия http://maksenov.info/
    Дата: 25.03.15 18:12
    Оценка: +1
    Здравствуйте, alex_public, Вы писали:

    _>Здравствуйте, gandjustas, Вы писали:


    G>>А если это будут mixins, типа Order<Order.Raw> -> Order<Order.Checked> итд?

    G>>Писать такое руками гемор еще тот, но нагенерить по метаинформации можно. Списки типов в C++ или продвинутые макросы не помогут такое реализовать?

    _>Да всё без проблем реализуется. Тут вопрос в другом. Если мы возьмём исключительно задачу вида "загрузить из БД, сделать одну элементарную операцию, сохранить в БД" (а именно на таком случае стал настаивать Mamut после того, как ему продемонстрировали эффективность работы для других случаев), то смысла в этом особого не будет. Потому как это получится просто перекидывание проверок в другое место исходников. Более того, такой код может даже хуже получиться (но всё равно без проблем реализуемо! Только вот зачем...) из-за большей многословности и размазывания проверок по разным местам, вместо одной компактной функции. И совсем другая ситуация получается, если в нашей задаче будет не одна элементарная операция, а некая последовательность операций. В этом случае проверки останутся только на входе в цепочку операций, а дальше корректность обеспечит система типов (причём с гарантией). В этом случае использование статической типизации может принести сразу несколько бонусов: и гарантированная корректность и уменьшение числа проверок в рантайме. Однако Mamut (да и Sinclair вслед за ними) уже не хотят рассматривать такую задачу, а настаивают на демонстрации преимуществ статической типизации исключительно для ситуации "одна элементарная операций (с кучей предусловий) в транзакции". )))


    А можно пример цепочки преобразований, где это реально поможет? Ну, то есть я примерн представляю развесистый бизнес-процесс с кучей шагов, но это ж на каждом шаге будет новый тип (для гарантированных проверок). А это для одной (логически) сущности мы создаем десятки типов на _каждый_ сложный бизнес-процесс. Стоит оно того? Для тех самых "сложных" случаев.
    Re[102]: Haskell нужен! (в Standard Chartered Bank)
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 25.03.15 18:15
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Здравствуйте, gandjustas, Вы писали:


    G>>А если это будут mixins, типа Order<Order.Raw> -> Order<Order.Checked> итд?


    G>>Писать такое руками гемор еще тот, но нагенерить по метаинформации можно. Списки типов в C++ или продвинутые макросы не помогут такое реализовать?

    J>У меня именно это и реализовано: http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15


    Это далеко не то, что надо.

    G>>Базовая проблема в том, что в программе в явном виде отсутствует ЖЦ ордера, поэтому компилятор не может ничем помочь.

    J>Это о чем?
    О том, что надо дать компилятору информацию о состояниях Order, чтобы эта информация была доступна в compile time. В большинстве языков это можно сделать только руками наплодив типы OrderRaw, OrderChecked, OrderShipped и OrderCompleted со своим набором методов. А в языках метапрограммированием и\или mixin_ами можно такие типы нагенерировать.

    Как нужный тип ордера поднимать из базы — не вопрос. Мы по сценарию знаем что нам нужен OrderChecked и запрашиваем из хранилища именно этот тип, а ORM проверяет атрибуты и кидает уже runtime exception.
    Re[103]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 25.03.15 18:29
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>>>Писать такое руками гемор еще тот, но нагенерить по метаинформации можно. Списки типов в C++ или продвинутые макросы не помогут такое реализовать?

    J>>У меня именно это и реализовано: http://rsdn.ru/forum/philosophy/5949645.1
    Автор: jazzer
    Дата: 10.02.15


    G>Это далеко не то, что надо.


    Почему не то?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[103]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 25.03.15 21:20
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Для каких «других» случаев? Никто ничего не продемонстрировал


    Не продемонстрировал? ) Совсем? ))) А как же ты тогда писал мне такое?

    Это они видны в твоем примере, потому что тебе так удобно. На практике SendOrder запишет в заказе поле is_sent=true и запишет в базу. Изменение суммы заказа, повторю, может произойти через неделю после того, как заказ отправился. И никаким переведением в «OnlyDecrease» SendOrder не будет заниматься, потому что это не ее область ответственности.


    Т.е. ты прекрасно увидел и понял демонстрацию работы статической типизации в моём примере. Но у меня там шли подряд 3 элементарные операции подряд, а не одна. И ты сразу начал требовать демонстрации именно для случая одной операции на транзакцию.

    M>Ну покажи пример неэлементарной операции Мы готовы рассматривать любые случаи, любые операции. Только вот никто не показывает Все упирается в два условия и «а дальше все понятно»


    Ты уже совсем забыл этот http://rsdn.ru/forum/philosophy/5971692
    Автор: alex_public
    Дата: 03.03.15
    мой примерчик? )
    Re[103]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 25.03.15 21:23
    Оценка:
    Здравствуйте, m.aksenov, Вы писали:

    MA>А можно пример цепочки преобразований, где это реально поможет? Ну, то есть я примерн представляю развесистый бизнес-процесс с кучей шагов, но это ж на каждом шаге будет новый тип (для гарантированных проверок). А это для одной (логически) сущности мы создаем десятки типов на _каждый_ сложный бизнес-процесс. Стоит оно того? Для тех самых "сложных" случаев.


    Если добавлять новые типы например с помощью параметра шаблона, то добавление новых типов не требует никаких условий. Я уже показывал здесь пример на эту тему: http://rsdn.ru/forum/philosophy/5971692
    Автор: alex_public
    Дата: 03.03.15
    . И это естественно не единственный необременительный вариант "плодить" типы. )))
    Re[104]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.03.15 08:08
    Оценка:
    M>>Ну покажи пример неэлементарной операции Мы готовы рассматривать любые случаи, любые операции. Только вот никто не показывает Все упирается в два условия и «а дальше все понятно»

    _>Ты уже совсем забыл этот http://rsdn.ru/forum/philosophy/5971692
    Автор: alex_public
    Дата: 03.03.15
    мой примерчик? )


    Этот твой примерчик даже близко не сможет реализовать мой «простейший пример». Ну и не реализовал, как видим. Но гонора-то, гонора!

    Ты перечитай мой
    Автор: Mamut
    Дата: 05.02.15
    «простейший пример с предусловиями» и все таки попробуй его реализовать своей статической типизацией. Благо, у меня там есть «подряд идут три элементарные операции, а не одна».

    Вы все решаете какие-то свои простейшие примеры уровня «hello, world», но при этом уверены, что они сложнее, чем моя задача. Ты сделай усилие и почитай мою задачу. Там есть и предусловия, и последовательность действий, зависящая от этих предусловий (надо сделать risk check, auth запрос, capture запрос, увеличить сумму), и ad-hoc изменения требований... Ну то есть ровным счетом все то, в чем, согласно вашим многочисленным заявлениям, стат. типизация прекрасно помогает.

    Но, почему-то, никто так и не родил решения


    dmitriid.comGitHubLinkedIn
    Re[105]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.03.15 10:35
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ты перечитай мой
    Автор: Mamut
    Дата: 05.02.15
    «простейший пример с предусловиями» и все таки попробуй его реализовать своей статической типизацией. Благо, у меня там есть «подряд идут три элементарные операции, а не одна».


    M>Вы все решаете какие-то свои простейшие примеры уровня «hello, world», но при этом уверены, что они сложнее, чем моя задача. Ты сделай усилие и почитай мою задачу. Там есть и предусловия, и последовательность действий, зависящая от этих предусловий (надо сделать risk check, auth запрос, capture запрос, увеличить сумму), и ad-hoc изменения требований... Ну то есть ровным счетом все то, в чем, согласно вашим многочисленным заявлениям, стат. типизация прекрасно помогает.


    M>Но, почему-то, никто так и не родил решения


    ОК, тогда я твою задачу неправильно понял (а ты меня ни разу не поправил).
    Раз это всё действия, а не просто проверки, ты можешь добавить в описание свой задачи список действий и предусловий на них?
    Потому что я предполагал, что это все — просто огромная толпа предусловий к increase_amount.
    Я правильно понял, что, помимо increase_amount, еще есть действия risk check, auth запрос, capture запрос?
    Если да, то в каких случаях каждое из них можно звать, а в каких — нельзя?
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[106]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.03.15 13:35
    Оценка:
    J>ОК, тогда я твою задачу неправильно понял (а ты меня ни разу не поправил).

    Как ее можно не понять, если она написана прямым текстом простейшими предложениями?

    J>Раз это всё действия, а не просто проверки, ты можешь добавить в описание свой задачи список действий и предусловий на них?

    J>Потому что я предполагал, что это все — просто огромная толпа предусловий к increase_amount.

    А сделать усилие и прочитать?

    J>Я правильно понял, что, помимо increase_amount, еще есть действия risk check, auth запрос, capture запрос?


    Прочти задачу

    J>Если да, то в каких случаях каждое из них можно звать, а в каких — нельзя?


    Прочти задачу


    dmitriid.comGitHubLinkedIn
    Re[94]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.03.15 15:46
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>Давай я еще раз задам вопросы, котрые ты стер — у тебя не займет много времени на них ответить:

    J>>

    J>>Непонятно, как я добавлял второе свойство? Если так, то с этого надо было начинать. Что конкретно непонятно?


    M>Я пять раз задал тебе один и тот же вопрос. Ты так и не осилил ни ответить на него, ни привести свое решение.


    То есть даже да/нет не можешь ответить? ОК, уровень конструктивности понятен. Sapienti sat.

    J>>Ну и до кучи

    J>>

    M>>>Пока что ты продолжаешь называть меня тупым

    J>>ссылку или извинись.


    M>Все твои отсылки к своей «статье», в которой якобы все описано, в ответ на любые мои вопросы.


    То есть ссылки не будет, извинений тоже.
    Ну что ж, по крайней мере, будь так добр впредь не выкладывать оскорбительную отсебятину под видом цитирования моих слов.
    Хотя, я думаю, ты это также проигнорируешь.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[107]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 26.03.15 15:47
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>Если да, то в каких случаях каждое из них можно звать, а в каких — нельзя?


    M>Прочти задачу


    Ну, хозяин-барин. Всего хорошего.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[108]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.03.15 19:41
    Оценка:
    J>>>Если да, то в каких случаях каждое из них можно звать, а в каких — нельзя?

    M>>Прочти задачу


    J>Ну, хозяин-барин. Всего хорошего.


    То есть я уже виноват в том, что ты не способен прочитать задачу, написанную простым языком?

    То есть ты банально не осилил следующее, а я виноват?

    jazzer: Раз это всё действия, а не просто проверки, ты можешь добавить в описание свой задачи список действий и предусловий на них?

    Задача, например пункт первый:

    — если заказ неотправлен и непредоплачен, можно увеличивать и уменьшать (предусловие)
    — если заказ отправлен, нельзя увеличивать, можно уменьшать (предусловие)
    — если сумма увеличивается, мы должны провести risk check. если risk check не проходит, товар никак не помечается, но изменение суммы не проходит (предусловие и действие)
    — если товар помечен, как risk, то изменять сумму нельзя (предусловие)


    jazzer: Я правильно понял, что, помимо increase_amount, еще есть действия risk check, auth запрос, capture запрос? Если да, то в каких случаях каждое из них можно звать, а в каких — нельзя?

    Задача, например третий пункт:

    Шаг 3.

    Все то же самое, что и в шаге 2. Дополнительно:

    — если заказ предоплачен (неважно, отправлен или нет), можно увеличивать сумму, если это разрешено конфигурацией магазина. Сумма, на которую можно увеличивать высчитывается, как в шаге 2
    — если заказ предоплачен, неотправлен, и сумма увеличивается, надо сделать auth-запрос в банк. если он не срабатывает, увеличить нельзя.
    — если заказ предоплачен, отправлен, и сумма увеличивается, надо сделать auth-запрос в банк на разницу в сумме, а потом сделать capture запрос на всю сумму. Если хоть один из них не срабатывает, увеличить нельзя.




    Все описано. Все последовательности, все предусловия, все условия, все «ad-hoc изменения». Нет. «Я тебя не понял»


    dmitriid.comGitHubLinkedIn
    Отредактировано 26.03.2015 20:01 Mamut [ищите в других сетях] . Предыдущая версия .
    Re[95]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.03.15 19:42
    Оценка:
    J>Хотя, я думаю, ты это также проигнорируешь.

    Я тут рядом понял, что я должен был давно тебя проигнорировать
    Автор: Mamut
    Дата: 26.03.15
    .

    Чувствую, что твое обещание решить задачу в апреле я тоже так и не дождусь


    dmitriid.comGitHubLinkedIn
    Re[95]: Ах, да
    От: Mamut Швеция http://dmitriid.com
    Дата: 26.03.15 19:59
    Оценка:
    J>>>Давай я еще раз задам вопросы, котрые ты стер — у тебя не займет много времени на них ответить:
    J>>>

    J>>>Непонятно, как я добавлял второе свойство? Если так, то с этого надо было начинать. Что конкретно непонятно?


    M>>Я пять раз задал тебе один и тот же вопрос. Ты так и не осилил ни ответить на него, ни привести свое решение.


    J>То есть даже да/нет не можешь ответить? ОК, уровень конструктивности понятен. Sapienti sat.



    Вот, что я тебе задавал раз пять только в этой подветке

    http://rsdn.ru/forum/philosophy/5972550.1



    Я хочу увидеть это «метасвойство». Я хочу увидеть, как решается заявленное тобой «типы помогают при ad-hoc дизайне», ведь именно для этого в моей задаче три шага.

    Я хочу увидеть, что да, действительно, после реализации «метасвойства», после которого «таким образом мы вернемся к простому первоначальному варианту», мы действительно вернемся к простому варианту, после которого можно будет действительно сказать, что «не сказать, что кода стало на 100500 порядков больше».


    http://rsdn.ru/forum/philosophy/5972971.1
    Автор: Mamut
    Дата: 04.03.15


    Покажи мне, где там пример кода мета-свойства IncreaseAmountOK, и как его использовать.

    Покажи мне пошагово, как и где твой код, реализующий шаг 1 легким движением руки превращается в код, реализующий шаг два (напомню: именно ты говорил о том, что типы позволяют легко справляться с ad-hoc изменениями). Почему у тебя все заканчивается строго и исключительно на «там дальше просто/очевидно/поянтно»?

    http://rsdn.ru/forum/philosophy/5975078.1
    Автор: Mamut
    Дата: 06.03.15


    Proof of concept с двумя условиями. Не решает даже первого пункта из моей задачи. Заканчивается на «ну там все легко/понятно/очевидно». Когда спрашиваешь: «мне не понятнои не очевидно, можно увидеть это развернутее», получаю раз за разом «что тебе там непонятно»

    Могу во второй раз спросить: покажи мне, пожалуйста, реализацию того самого «очевидно понятного мета-свойства IncreaseAmountOK», желательно в сочетании с кодом, чтобы можно было увидеть, как все эти заявления работают на практике?

    http://rsdn.ru/forum/philosophy/5976094.1
    Автор: Mamut
    Дата: 08.03.15


    Ты уже в десятый раз говоришь о том, что, мол, в статье все написано. Заметь, я уже несколько раз тебе пишу:
    Покажи мне, где там пример кода мета-свойства IncreaseAmountOK, и как его использовать.

    http://rsdn.ru/forum/philosophy/5976311.1
    Автор: Mamut
    Дата: 08.03.15


    Можно наконец-то увидеть это решение? Хоть мегасвойством хоть комбинацией? Я слышу много разговоров о том, как это можно решить и ноль решений

    Да. Мне непонятно, как это решить, несмотря на тот кусок кода, что ты привел ПОтому что твой кусок кода не отвечает на вопросы:
    — что будет, когда условий больше двух
    — как реализовать то самое «мета-свойство»

    http://rsdn.ru/forum/philosophy/5977772.1
    Автор: Mamut
    Дата: 10.03.15


    Да. Мне непонятно. Я вижу распухающий от этих типов и PROP_IF'ов код, за которым не видно не то, что леса, но даже того, что вообще в коде происходит. Я зотел бы увидеть законченный код То есть где не только «добавлено третье-четвертое свойство» в тип, но и есть код, который с этими типами работает



    и так далее...


    Хотя учитывая, что ты даже не смог понять задачу, описанную простым и ясным языком, неудивительно, что ты не понял ни одного моего вопроса

    Когда в следующий раз будешь говорить об уровне конструктива, смотри в зеркало.


    dmitriid.comGitHubLinkedIn
    Re[105]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 27.03.15 01:20
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Этот твой примерчик даже близко не сможет реализовать мой «простейший пример». Ну и не реализовал, как видим. Но гонора-то, гонора!


    Никто и не пытался решать за тебя твою задачку. Все писали демонстрации различных техник, используя твою тематику. Для понимания нормальным специалистом этого более чем достаточно.

    Ну и описание твоего примера не полно, т.к. не указано устройство окружающего мира: кто и как использует твои элементарные функции и т.п. Если у тебя всё происходит только в режиме "прочитали ордер из БД, увеличили сумму (если предусловия позволяют), записали ордер в БД", то мой пример действительно ничего интересного не демонстрирует. Т.е. он всё равно работает и решает поставленную тобой задачу, но при этом не даёт никаких бонусов (типа уменьшения числа рантайм проверок и т.п.), хотя и увеличивает объём кода — очевидно такое не имеет особого смысла. Если же у тебя там где-то встречается больше одной элементарной операции на транзакцию, то как раз мой пример реально демонстрирует преимущества подобной техники. И чем сложнее алгоритм (набор элементарных операций над ордером в рамках одной транзакции), тем больше будет преимущество.

    M>Ты перечитай мой
    Автор: Mamut
    Дата: 05.02.15
    «простейший пример с предусловиями» и все таки попробуй его реализовать своей статической типизацией. Благо, у меня там есть «подряд идут три элементарные операции, а не одна».


    M>Вы все решаете какие-то свои простейшие примеры уровня «hello, world», но при этом уверены, что они сложнее, чем моя задача. Ты сделай усилие и почитай мою задачу. Там есть и предусловия, и последовательность действий, зависящая от этих предусловий (надо сделать risk check, auth запрос, capture запрос, увеличить сумму), и ad-hoc изменения требований... Ну то есть ровным счетом все то, в чем, согласно вашим многочисленным заявлениям, стат. типизация прекрасно помогает.


    Нет у тебя нигде ни нескольких операций, ни одной операции, ни чего-либо ещё. У тебя вообще вопрос применения твоих функций полностью обойдён стороной. Ну т.е. это в собственно твоём описание задачки. А после, ты уже начал требовать определённую схему применения — как раз ту единственную, где применение демонстрируемых техник не приносит особо заметных плюсов. )))

    Да, и "risk check", "auth запрос" и т.п. не являются элементарными операциями, т.к. действуют не над ордерами — это просто обычные проверки. Так что из них никакие цепочки операций не строятся.

    О, и кстати... В моём простеньком примере польза от уменьшения компилятором числа рантайм проверок имеет только "философский" смысл, а на практике очевидно абсолютно не ощутимо (там собственно один if с целочисленным сравнением). А вот в случае появления сложных проверок, возможно делающих какие-то внешние запросы и соответственно долго выполняющихся (как раз как у тебя похоже), это уже обретает реальный смысл.
    Re[106]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 27.03.15 08:29
    Оценка:
    M>>Этот твой примерчик даже близко не сможет реализовать мой «простейший пример». Ну и не реализовал, как видим. Но гонора-то, гонора!
    _>Никто и не пытался решать за тебя твою задачку. Все писали демонстрации различных техник, используя твою тематику.

    Перевод: все писали только то, что они осилили. Все примеры — уровня hello, world.

    _>Ну и описание твоего примера не полно, т.к. не указано устройство окружающего мира: кто и как использует твои элементарные функции и т.п.


    Для решения моей задачи это не нужно.

    _>Если у тебя всё происходит только в режиме


    Ты уже один раз осиль и прочти условие задачи. А то выглядишь, как jazzer
    Автор: Mamut
    Дата: 26.03.15
    .

    _>И чем сложнее алгоритм (набор элементарных операций над ордером в рамках одной транзакции), тем больше будет преимущество.


    Слушай, ну хватит сказки рассказывать, а? Вы не осилили решение достаточно простого алгоритма, но утверждаете, что, якобы, на сложном алгоритме вот прямо-таки будет видно преимущество


    M>>Вы все решаете какие-то свои простейшие примеры уровня «hello, world», но при этом уверены, что они сложнее, чем моя задача. Ты сделай усилие и почитай мою задачу. Там есть и предусловия, и последовательность действий, зависящая от этих предусловий (надо сделать risk check, auth запрос, capture запрос, увеличить сумму), и ad-hoc изменения требований... Ну то есть ровным счетом все то, в чем, согласно вашим многочисленным заявлениям, стат. типизация прекрасно помогает.


    _>Нет у тебя нигде ни нескольких операций, ни одной операции, ни чего-либо ещё.



    Ага. То есть ты как jazzer. Не осилил даже задачу прочитать. Там есть несколько операций. Для этого достаточно прочитать задачу, а не фантазировать на ее тему.

    _>О, и кстати... В моём простеньком примере польза от уменьшения компилятором числа рантайм проверок имеет только "философский" смысл, а на практике очевидно абсолютно не ощутимо (там собственно один if с целочисленным сравнением). А вот в случае появления сложных проверок


    Ну приведи пример «со сложными проверками» ©™ в «более сложном алгоритме» ©™, что бы ты под этим ни понимал. А то на сотой странице обсуждения ВНЕАЗПНО jazzer заявляет, что у меня в примере нет логики, а ты заявляешь, что нет операций.


    dmitriid.comGitHubLinkedIn
    Re[107]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 27.03.15 22:57
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    _>>Ну и описание твоего примера не полно, т.к. не указано устройство окружающего мира: кто и как использует твои элементарные функции и т.п.

    M>Для решения моей задачи это не нужно.

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

    _>>Если у тебя всё происходит только в режиме

    M>Ты уже один раз осиль и прочти условие задачи. А то выглядишь, как jazzer
    Автор: Mamut
    Дата: 26.03.15
    .


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

    _>>И чем сложнее алгоритм (набор элементарных операций над ордером в рамках одной транзакции), тем больше будет преимущество.

    M>Слушай, ну хватит сказки рассказывать, а? Вы не осилили решение достаточно простого алгоритма, но утверждаете, что, якобы, на сложном алгоритме вот прямо-таки будет видно преимущество

    Я тебе показал компилируемый пример. Если тебе этого недостаточно для понимания, то это уже не моя проблема. )

    _>>Нет у тебя нигде ни нескольких операций, ни одной операции, ни чего-либо ещё.

    M>Ага. То есть ты как jazzer. Не осилил даже задачу прочитать. Там есть несколько операций. Для этого достаточно прочитать задачу, а не фантазировать на ее тему.

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

    _>>О, и кстати... В моём простеньком примере польза от уменьшения компилятором числа рантайм проверок имеет только "философский" смысл, а на практике очевидно абсолютно не ощутимо (там собственно один if с целочисленным сравнением). А вот в случае появления сложных проверок

    M>Ну приведи пример «со сложными проверками» ©™ в «более сложном алгоритме» ©™, что бы ты под этим ни понимал. А то на сотой странице обсуждения ВНЕАЗПНО jazzer заявляет, что у меня в примере нет логики, а ты заявляешь, что нет операций.

    Я пример уже привёл. Изменение предусловия с простейшего на более сложное (например обращающееся к сети, как вроде бы у тебя и есть в определённых случаях) абсолютно не изменит устройство моего примера. Просто при этом применение данной техники покажет уже вполне ощутимое на практике изменение в быстродействие...
    Re[96]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 28.03.15 05:31
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    J>>Хотя, я думаю, ты это также проигнорируешь.


    M>Я тут рядом понял, что я должен был давно тебя проигнорировать
    Автор: Mamut
    Дата: 26.03.15
    .


    Ты это и так делаешь все это время, не вижу, чтобы что-то изменилось, если ты это начнешь делать с предварительным объявлением.

    M>Чувствую, что твое обещание решить задачу в апреле я тоже так и не дождусь


    Вообще-то да, я не вижу смысла напрягаться ради человека, который открыто демонстрирует свое неуважение ко мне. Тебе это уже говорили многие и много раз, но тебе либо пофиг, либо этого ты и добиваешься. Всего хорошего.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[97]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 28.03.15 07:57
    Оценка:
    M>>Чувствую, что твое обещание решить задачу в апреле я тоже так и не дождусь

    J>Вообще-то да, я не вижу смысла напрягаться ради человека, который открыто демонстрирует свое неуважение ко мне. Тебе это уже говорили многие и много раз, но тебе либо пофиг, либо этого ты и добиваешься. Всего хорошего.



    Я, вообще-то, уважаю всех. Пока не оказывается, что на протяжение 100 страниц все скатывается только в демагогию, а потом ВНЕЗАПНО оказывается, что логика не та, задача не та, ты не осилил прочитать даже условие задачи, предусловия не те и т.п.

    Я тебя сколько — пять? — раз просил простейшее: не фантазировать на тему моей задачи, а решить хотя бы первый пункт из нее и показать мне, как реализуется метасвойство IncreaeAmountOk. Свои ответы ты можешь сам посмотреть.

    И после этого ты еще заикаешься о каком-то уважении, ага.


    dmitriid.comGitHubLinkedIn
    Re[108]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 28.03.15 08:06
    Оценка:
    _>>>Ну и описание твоего примера не полно, т.к. не указано устройство окружающего мира: кто и как использует твои элементарные функции и т.п.
    M>>Для решения моей задачи это не нужно.

    _>Для формального факта решения задачи действительно не нужно. Но решить её можно десятками разных способов (вот например возьму я и интегрирую какой-нибудь движок специализированного dsl) и определиться с тем, какой способ самый эффективный, можно только имя полную картину использования данного решения.


    На это я отвечал Sinclair'у здесь: http://rsdn.ru/forum/philosophy/5986770.1
    Автор: Mamut
    Дата: 18.03.15


    _>>>Если у тебя всё происходит только в режиме

    M>>Ты уже один раз осиль и прочти условие задачи. А то выглядишь, как jazzer
    Автор: Mamut
    Дата: 26.03.15
    .

    _>У тебя в условие задачи нет ни одного слова про то, сколько элементарных операций над ордерами происходит за одну транзакцию.


    Ага. То есть на 100500 странице обсуждений мы ВНЕЗАПНО выясняем границы применимости вашего подхода:
    — это не логика (неизвестно, что вы считаете логикой)
    — предусловия не те (неизвестно, что вы считаете теми)
    — действия не те (неизвестно, что вы считаете теми)




    То есть все ваши сказки
    Автор: Mamut
    Дата: 07.02.15
    являются просто сказками. Спасибо.

    _>>>И чем сложнее алгоритм (набор элементарных операций над ордером в рамках одной транзакции), тем больше будет преимущество.

    M>>Слушай, ну хватит сказки рассказывать, а? Вы не осилили решение достаточно простого алгоритма, но утверждаете, что, якобы, на сложном алгоритме вот прямо-таки будет видно преимущество

    _>Я тебе показал компилируемый пример. Если тебе этого недостаточно для понимания, то это уже не моя проблема. )



    Твой пример даже близко не решает поставленную задачу, и как из него следует, что на «сложных алгоритмах будет видно преимущество», неизвестно. Ведь:
    — вы не осилили даже «простой» алгоритм
    — ты не смог дать определение «более сложного» алгоритма


    _>>>Нет у тебя нигде ни нескольких операций, ни одной операции, ни чего-либо ещё.

    M>>Ага. То есть ты как jazzer. Не осилил даже задачу прочитать. Там есть несколько операций. Для этого достаточно прочитать задачу, а не фантазировать на ее тему.

    _>Да, у тебя есть несколько операций (типа изменить сумму, установить флаг риска, отправленно и т.п.). Но у тебя не указано, как эти операции используются (какие последовательности из них встречаются в ваших алгоритмах).


    Ты опять ршаешь не поставленную задачу, а какие-то фантазии на тему этой задачи. Считай, что это — API вызов, который вызывается откуда. Или ты как jazzer и Евгений
    Автор: Mamut
    Дата: 05.03.15
    ?


    _>Я пример уже привёл. Изменение предусловия с простейшего на более сложное (например обращающееся к сети, как вроде бы у тебя и есть в определённых случаях) абсолютно не изменит устройство моего примера. Просто при этом применение данной техники покажет уже вполне ощутимое на практике изменение в быстродействие...


    Демагогия, демагогия, демагогия. Пока что я вижу вот это
    Автор: Mamut
    Дата: 23.03.15
    и это
    Автор: Mamut
    Дата: 26.03.15


    Твой «примерчик» моментально разваливается для моей задачи. Потому что твой «примерчик» способен только обработать именно что только простейшую последовательность простейших операций. Как только между этими операциями появляются хоть какие-то условия (как в моем примере, шаг 3, например), все твои заявления про «последовательности операций» и «сложные алгоритмы» вылетают в трубу.


    dmitriid.comGitHubLinkedIn
    Re[109]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 28.03.15 21:20
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    _>>У тебя в условие задачи нет ни одного слова про то, сколько элементарных операций над ордерами происходит за одну транзакцию.


    M>Ага. То есть на 100500 странице обсуждений мы ВНЕЗАПНО выясняем границы применимости вашего подхода:

    M>- это не логика (неизвестно, что вы считаете логикой)
    M>- предусловия не те (неизвестно, что вы считаете теми)
    M>- действия не те (неизвестно, что вы считаете теми)

    M>


    M>То есть все ваши сказки
    Автор: Mamut
    Дата: 07.02.15
    являются просто сказками. Спасибо.


    Ммм, а как интересно этот мутный поток мыслей связан с моей чёткой фразой о нехватке одного нюанса в твоём описание задачи?


    _>>Я тебе показал компилируемый пример. Если тебе этого недостаточно для понимания, то это уже не моя проблема. )


    M>Твой пример даже близко не решает поставленную задачу, и как из него следует, что на «сложных алгоритмах будет видно преимущество», неизвестно. Ведь:

    M>- вы не осилили даже «простой» алгоритм
    M>- ты не смог дать определение «более сложного» алгоритма

    Вообще то именно этот пример и демонстрирует "сложный алгоритм". Потому как в данном контексте под "сложным алгоритмом" подразумевалось всего лишь более одной элементарной операции на транзакцию. А в том моём примере показана демонстрация с 3-мя операциями на транзакцию. И в нём чётко видно, что одна из проверок времени исполнения переместилась во время компиляции.


    _>>Да, у тебя есть несколько операций (типа изменить сумму, установить флаг риска, отправленно и т.п.). Но у тебя не указано, как эти операции используются (какие последовательности из них встречаются в ваших алгоритмах).


    M>Ты опять ршаешь не поставленную задачу, а какие-то фантазии на тему этой задачи. Считай, что это — API вызов, который вызывается откуда. Или ты как jazzer и Евгений
    Автор: Mamut
    Дата: 05.03.15
    ?


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


    M>Твой «примерчик» моментально разваливается для моей задачи. Потому что твой «примерчик» способен только обработать именно что только простейшую последовательность простейших операций. Как только между этими операциями появляются хоть какие-то условия (как в моем примере, шаг 3, например), все твои заявления про «последовательности операций» и «сложные алгоритмы» вылетают в трубу.


    Повторюсь ещё раз: данный подход применим вообще для любого случая и любой задачи. Просто процент перемещённых во время компиляции проверок будет разный.
    Re[110]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 28.03.15 22:18
    Оценка:
    M>>Ага. То есть на 100500 странице обсуждений мы ВНЕЗАПНО выясняем границы применимости вашего подхода:
    M>>- это не логика (неизвестно, что вы считаете логикой)
    M>>- предусловия не те (неизвестно, что вы считаете теми)
    M>>- действия не те (неизвестно, что вы считаете теми)

    M>>


    M>>То есть все ваши сказки
    Автор: Mamut
    Дата: 07.02.15
    являются просто сказками. Спасибо.


    _>Ммм, а как интересно этот мутный поток мыслей связан с моей чёткой фразой о нехватке одного нюанса в твоём описание задачи?



    Извини, но у меня очень четкий и понятный поток мыслей. В отличие от. Чем тебе не нравится последовательность действий в моей задаче?


    _>>>Я тебе показал компилируемый пример. Если тебе этого недостаточно для понимания, то это уже не моя проблема. )


    M>>Твой пример даже близко не решает поставленную задачу, и как из него следует, что на «сложных алгоритмах будет видно преимущество», неизвестно. Ведь:

    M>>- вы не осилили даже «простой» алгоритм
    M>>- ты не смог дать определение «более сложного» алгоритма

    _>Вообще то именно этот пример и демонстрирует "сложный алгоритм".


    Ахахаха. Вообще-то, не демонстрирует. Твой пример демонстрирует уровень "hello, world".

    _>Потому как в данном контексте под "сложным алгоритмом" подразумевалось всего лишь более одной элементарной операции на транзакцию.


    Пожалуйста,в моей задаче в третьем шаге есть больше одного элементарного дейтсвия. Пожалуйста, продемонстрируй, как твой, цитрую, «подход, который применим вообще для любого случая и любой задачи», решает не твою задачу hellow, world, а мою задачу, которая настолько сложнее, что вы всем скопом уже месяц не можете ее решить.

    M>>Ты опять ршаешь не поставленную задачу, а какие-то фантазии на тему этой задачи. Считай, что это — API вызов, который вызывается откуда. Или ты как jazzer и Евгений
    Автор: Mamut
    Дата: 05.03.15
    ?


    _>Ну так тут как раз дело в том, что если при использование данного API будут происходить вызовы нескольких функций подряд, то может быть эффективнее один подход, а если не будут, то другой.


    Я же говорю, ты продолжаешь решать не мою задачу, а свои фантазии на тему моей задачи. То есть, ты превращаешься в Евгения: http://rsdn.ru/forum/philosophy/5973616
    Автор: Mamut
    Дата: 05.03.15


    dmitriid.comGitHubLinkedIn
    Re[111]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 29.03.15 18:10
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    _>>Ммм, а как интересно этот мутный поток мыслей связан с моей чёткой фразой о нехватке одного нюанса в твоём описание задачи?

    M>Извини, но у меня очень четкий и понятный поток мыслей. В отличие от. Чем тебе не нравится последовательность действий в моей задаче?

    С задачей всё нормально как раз (ну если не считать отсутствие описания стратегии использования). Это была речь о списке невнятных претензий в цитате выше. Которые к тому же не имеют ко мне вообще никакого отношения.

    _>>Вообще то именно этот пример и демонстрирует "сложный алгоритм".

    M>Ахахаха. Вообще-то, не демонстрирует. Твой пример демонстрирует уровень "hello, world".

    Хм, для тебя открытие, что для примера технологии лучше всего демонстрировать максимально простой случай?

    M>Пожалуйста,в моей задаче в третьем шаге есть больше одного элементарного дейтсвия. Пожалуйста, продемонстрируй, как твой, цитрую, «подход, который применим вообще для любого случая и любой задачи», решает не твою задачу hellow, world, а мою задачу, которая настолько сложнее, что вы всем скопом уже месяц не можете ее решить.


    Я уже всё продемонстрировал на эту тему (когда имеем более одной элементарной операции на транзакцию) — компилируемого примера более чем достаточно для понимания. Вот для случая "одна операция на транзакцию", который ты в последнее время стал навязывать, эта техника действительно не сработает (т.е. код то работать будет, но не лучше варианта в лоб), так что тут можно подумать о других вариантах использования статической типизации. Например какой-то автоматический контроль наличия проверок (а не перенос их во время компиляции) и т.п. Вроде как пример jazzer'а можно использовать там, хотя не уверен (не пробовал его код на практике). Ну собственно я уже говорил, что на эту тему я решение ещё продумывал. )

    M>Я же говорю, ты продолжаешь решать не мою задачу, а свои фантазии на тему моей задачи. То есть, ты превращаешься в Евгения: http://rsdn.ru/forum/philosophy/5973616
    Автор: Mamut
    Дата: 05.03.15


    Хм, ну судя по моему общению с ним на этом форуме, то это скорее как комплимент звучит... )))
    Re[112]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 29.03.15 19:28
    Оценка:
    _>>>Ммм, а как интересно этот мутный поток мыслей связан с моей чёткой фразой о нехватке одного нюанса в твоём описание задачи?
    M>>Извини, но у меня очень четкий и понятный поток мыслей. В отличие от. Чем тебе не нравится последовательность действий в моей задаче?

    _>С задачей всё нормально как раз (ну если не считать отсутствие описания стратегии использования). Это была речь о списке невнятных претензий в цитате выше. Которые к тому же не имеют ко мне вообще никакого отношения.


    Вот смотри.

    Задача полностью соответсвует всем критериям, которые вы мне тыт выдвигаете:

    — в ней есть предусловия, которые так хочет Евгений Панасюк
    — в ней есть условия и ad-hoc изменения, которые хочет jazzer
    — в ней есть последовательность условий, которые требуешь ты

    После сотни страниц демагогии, внезапно оказывается, что:
    — предусловия не такие (Евгений)
    — там не логика, там миллион условий, задача непонятна (jazzer)
    — там последовательность условий не такая, нужно знать стратегии использования (ты)




    _>>>Вообще то именно этот пример и демонстрирует "сложный алгоритм".

    M>>Ахахаха. Вообще-то, не демонстрирует. Твой пример демонстрирует уровень "hello, world".
    _>Хм, для тебя открытие, что для примера технологии лучше всего демонстрировать максимально простой случай?

    Молодец. Продемоснтрировал. Я задаю вопрос, усложняющий пример. Ответа не могу получить уже два месяца.

    M>>Пожалуйста,в моей задаче в третьем шаге есть больше одного элементарного дейтсвия. Пожалуйста, продемонстрируй, как твой, цитрую, «подход, который применим вообще для любого случая и любой задачи», решает не твою задачу hellow, world, а мою задачу, которая настолько сложнее, что вы всем скопом уже месяц не можете ее решить.


    _>Я уже всё продемонстрировал на эту тему


    Ты ничего не продемонстрировал, кроме примитивнейшей последовательности действий. Ты и близко не продемонстрировал даже решение первого, самого простого, пункта моей задачи. Я умолчу про решение третьего.

    _>(когда имеем более одной элементарной операции на транзакцию) — компилируемого примера более чем достаточно для понимания. Вот для случая "одна операция на транзакцию", который ты в последнее время стал навязывать


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

    _>, эта техника действительно не сработает


    данный подход применим вообще для любого случая и любой задачи.



    Еще раз.

    В задаче есть: условия и последовательность действий. Только вот незадача, какая именно последовательность, зависит от этих же условий. Я не прошу многого, я прошу продемонстрировать только одно: как в этих условиях будет работать ваша хваленая стат. типизация, которая «применима вообще для любого случая и любой задачи»

    Нафига тебе надо знать «стратегию условия» этого вызова? У тебя есть сам вызов с последовательностью действий. Считай, что это — API вызов, который вызывается из 50-и мест. И внутри него происходит, цитируя тебя, «последовательность элементарных операций»

    Повторю еще раз. Ты не смог даже понять условие задачи, а решаешь какие-то свои фантазии на тему этой задачи. Поэтому тебе нужны «стратегии использования», все эти «send order» и т.п. На.фи.га? Ты неспособен решить поставленную задачу без этого? Почему?


    dmitriid.comGitHubLinkedIn
    Re[113]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 29.03.15 21:07
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Вот смотри.


    M>Задача полностью соответсвует всем критериям, которые вы мне тыт выдвигаете:


    M>- в ней есть предусловия, которые так хочет Евгений Панасюк

    M>- в ней есть условия и ad-hoc изменения, которые хочет jazzer
    M>- в ней есть последовательность условий, которые требуешь ты

    Я тебе уже раз 10 говорил, что нужна последовательность операций, а не условий (сложность условия вообще никак не влияет). Если ты до сих пор этого не понял, то я умываю руки...

    M>После сотни страниц демагогии, внезапно оказывается, что:

    M>- предусловия не такие (Евгений)
    M>- там не логика, там миллион условий, задача непонятна (jazzer)
    M>- там последовательность условий не такая, нужно знать стратегии использования (ты)

    M>


    У тебя там не "не такая" последовательность условий, а просто неизвестно какая — она просто не указана в описание задачи. )))

    M>Молодец. Продемоснтрировал. Я задаю вопрос, усложняющий пример. Ответа не могу получить уже два месяца.


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

    M>Ты ничего не продемонстрировал, кроме примитивнейшей последовательности действий. Ты и близко не продемонстрировал даже решение первого, самого простого, пункта моей задачи. Я умолчу про решение третьего.


    Ммм, а что значит не продемонстрировал решение? ) Вообще то как раз демонстрация есть. Более того, этот код будет работать и для случая "одной элементарной операции на транзакцию". Просто в этом случае он будет полностью аналогичен (в рантайме) твоему коду в лоб, так что нет никакого смысла в этом случае возиться.

    _>>(когда имеем более одной элементарной операции на транзакцию) — компилируемого примера более чем достаточно для понимания. Вот

    _>>, эта техника действительно не сработает
    M>

    M>данный подход применим вообще для любого случая и любой задачи.


    Я вроде бы уже несколько раз говорил. Код будет работать вообще в любом случае. Но в самом вырожденном случае (одна операция на транзакцию) он будет полностью аналогичен (в рантайме) твоему коду в лоб. В других же случаях часть рантайм проверок перейдёт во время компиляции (именно я и называю "срабатыванием" техники). Процент перехода зависит от устройства и сложности алгоритма.


    M>Нафига тебе надо знать «стратегию условия» этого вызова? У тебя есть сам вызов с последовательностью действий. Считай, что это — API вызов, который вызывается из 50-и мест. И внутри него происходит, цитируя тебя, «последовательность элементарных операций»


    M>Повторю еще раз. Ты не смог даже понять условие задачи, а решаешь какие-то свои фантазии на тему этой задачи. Поэтому тебе нужны «стратегии использования», все эти «send order» и т.п. На.фи.га? Ты неспособен решить поставленную задачу без этого? Почему?


    Ну если ты не смог понять этого после всех моих пояснений, то я не вижу смысла продолжать эту дискуссию...
    Re[112]: Haskell нужен! (в Standard Chartered Bank)
    От: m.aksenov Россия http://maksenov.info/
    Дата: 30.03.15 06:58
    Оценка:
    Здравствуйте, alex_public, Вы писали:

    _>Здравствуйте, Mamut, Вы писали:


    _>>>Ммм, а как интересно этот мутный поток мыслей связан с моей чёткой фразой о нехватке одного нюанса в твоём описание задачи?

    M>>Извини, но у меня очень четкий и понятный поток мыслей. В отличие от. Чем тебе не нравится последовательность действий в моей задаче?

    _>С задачей всё нормально как раз (ну если не считать отсутствие описания стратегии использования). Это была речь о списке невнятных претензий в цитате выше. Которые к тому же не имеют ко мне вообще никакого отношения.


    _>>>Вообще то именно этот пример и демонстрирует "сложный алгоритм".

    M>>Ахахаха. Вообще-то, не демонстрирует. Твой пример демонстрирует уровень "hello, world".

    _>Хм, для тебя открытие, что для примера технологии лучше всего демонстрировать максимально простой случай?


    Это, видимо, как с юнит-тестами. Пока мы тестируем сложение двух чисел — все нормально. Как только нужно тестировать чуть более сложное поведение, например вполне чистую реализацию какого-нибудь хитрого алгоритма, мы сразу попадаем на то, что нужны функциональные тесты, а не вот это вот. Простые случаи как раз неинтересны, если только не заниматься исключительно такими задачами.
    Re[103]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 30.03.15 07:17
    Оценка:
    Здравствуйте, m.aksenov, Вы писали:

    MA>А можно пример цепочки преобразований, где это реально поможет? Ну, то есть я примерн представляю развесистый бизнес-процесс с кучей шагов, но это ж на каждом шаге будет новый тип (для гарантированных проверок). А это для одной (логически) сущности мы создаем десятки типов на _каждый_ сложный бизнес-процесс. Стоит оно того? Для тех самых "сложных" случаев.


    В моем примере никаких десятков типов не создается, есть обобщенный один тип-контейнер "тип со свойствами". Так что нет никакой необходимости рожать руками толпу типов, нужны только свойства. Соответственно, на входе у функций проверяется не конкретный тип, а лишь наличие нужных свойств (а какие там другие свойства — пофиг).
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[104]: Haskell нужен! (в Standard Chartered Bank)
    От: m.aksenov Россия http://maksenov.info/
    Дата: 30.03.15 09:07
    Оценка:
    Здравствуйте, jazzer, Вы писали:

    J>Здравствуйте, m.aksenov, Вы писали:


    MA>>А можно пример цепочки преобразований, где это реально поможет? Ну, то есть я примерн представляю развесистый бизнес-процесс с кучей шагов, но это ж на каждом шаге будет новый тип (для гарантированных проверок). А это для одной (логически) сущности мы создаем десятки типов на _каждый_ сложный бизнес-процесс. Стоит оно того? Для тех самых "сложных" случаев.


    J>В моем примере никаких десятков типов не создается, есть обобщенный один тип-контейнер "тип со свойствами". Так что нет никакой необходимости рожать руками толпу типов, нужны только свойства. Соответственно, на входе у функций проверяется не конкретный тип, а лишь наличие нужных свойств (а какие там другие свойства — пофиг).


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

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

    В любом случае, за пример спасибо.
    Re[105]: Haskell нужен! (в Standard Chartered Bank)
    От: jazzer Россия Skype: enerjazzer
    Дата: 30.03.15 09:40
    Оценка:
    Здравствуйте, m.aksenov, Вы писали:

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

    Ну, к шаблонам по-разному можно относиться.
    В моем случае происходит переписывание типа после каждой проверки, отражающее факт того, что проверка была произведена, и результат оной. Но это все происходит "под капотом", наружу изменение типа не торчит, а главный тип остается прежним.
    Рулез в том, что ты мог проверить десяток условий, и у тебя навесится десяток разных свойств, но каждая функция, которую ты зовешь для финального объекта, будет смотреть только на те свойства, которые ей нужны, и игнорировать другие. Так что для них это разнообразие типов будет сводиться к дихотомии "есть или нет в тип набор свойств, который мне нужен".

    MA>Другое дело, что подход интересный, но выглядит как шаманство (у меня очень ограниченный опыт использования современного С++). К сожалению, проверки в рантайме (и тесты, разумеется) это целиком не заменит, но может быть статически верифицируемые места и позволит обезопасить. Нужно будет в старом Скала-проекте попробовать что-то такое замутить. С ее системой типов это будет может и поинтереснее даже.


    Так я и не утверждал, что они заменят рантайм-проверки. Они не для того, чтоб их заменить, а для того, чтобы не позволить их пропустить и позвать функцию, которую звать без предварительной проверки нельзя. Т.е. вызов sqrt(x) является ошибкой программиста, если x<0. Если ее объявить как требующую для x свойство Nonnegative — то компилятор не пропустит вызов без соответствующей проверки. При этом не обязательно делать именно проверку, можно это гарантировать иначе, например, функция модуля fabs будет автоматом навешивать это свойство на свой результат — и тогда его можно сразу закидывать в sqrt напрямую.
    jazzer (Skype: enerjazzer) Ночная тема для RSDN
    Автор: jazzer
    Дата: 26.11.09

    You will always get what you always got
      If you always do  what you always did
    Re[114]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 30.03.15 12:51
    Оценка:
    _>Я тебе уже раз 10 говорил, что нужна последовательность операций, а не условий (сложность условия вообще никак не влияет). Если ты до сих пор этого не понял, то я умываю руки...

    Последовательность операций есть.

    _>У тебя там не "не такая" последовательность условий, а просто неизвестно какая — она просто не указана в описание задачи. )))



    Она прекрасно указана в задаче. Если ты не способен (как и jazzer) наконец0-то сесть и прочитать ее, это не мои проблемы

    Там есть: risk check, auth, capture, increase (или decrease) amount

    _>Ммм, а что значит не продемонстрировал решение? ) Вообще то как раз демонстрация есть. Более того, этот код будет работать и для случая "одной элементарной операции на транзакцию".


    Ты опять фантазируешь на темы задачи и активно борешься со своими фантазиями

    _>Ну если ты не смог понять этого после всех моих пояснений, то я не вижу смысла продолжать эту дискуссию...


    У тебя нет пояснений. У тебя есть какое-то упорное желание фантазировать на темы. «Ах-ах-ах, вот тебе пример, там есть три действия подряд с одним условием, это такая прекрасная демонстрация». Только это — фэнтезийный сферовакуумный теоретический пример. На практике между этими тремя действиями есть толпа условий. Каждое следующее действие вполне может зависеть от результата предыдущего действия. И как решается это, ни ты, ни кто либо другой так и не осилили показать. Несмотря на все высокопарные и пафосные заявления.


    dmitriid.comGitHubLinkedIn
    Re[115]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 30.03.15 18:57
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Она прекрасно указана в задаче. Если ты не способен (как и jazzer) наконец0-то сесть и прочитать ее, это не мои проблемы

    M>Там есть: risk check, auth, capture, increase (или decrease) amount

    Ты уже определись, risk check, auth и т.п. — это отдельные операции над ордерами (т.е. меняют их) или же просто какие-то условия на выполнение операций increase/decrease?

    M>У тебя нет пояснений. У тебя есть какое-то упорное желание фантазировать на темы. «Ах-ах-ах, вот тебе пример, там есть три действия подряд с одним условием, это такая прекрасная демонстрация». Только это — фэнтезийный сферовакуумный теоретический пример. На практике между этими тремя действиями есть толпа условий. Каждое следующее действие вполне может зависеть от результата предыдущего действия. И как решается это, ни ты, ни кто либо другой так и не осилили показать. Несмотря на все высокопарные и пафосные заявления.


    Ты действительно считаешь, что если в моём примере заменить
    X();
    Y();
    Z();

    на
    X();
    Y();
    if(complex_condition()) Z1();
    else Z2();

    то это вообще что-то изменит? )
    Re[116]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 30.03.15 20:25
    Оценка:
    _>Ты уже определись, risk check, auth и т.п. — это отдельные операции над ордерами (т.е. меняют их) или же просто какие-то условия на выполнение операций increase/decrease?

    Ты уже определись, прочитаешь ты условие задачи, или нет.

    Это — отдельные операции над ордерами. Будут эти операции происходить или нет, зависит от различных предусловий. Будут ли происходить очередные операции, часто зависит от результата предыдущих операций.

    Мне уже надоело одно и то же писать разными предложениями. Твой примитивный пример и настойчивость, что все в мире является лишь последовательностью операций являются лишь теоретическими изысканиями и фантазиями на тему.

    M>>У тебя нет пояснений. У тебя есть какое-то упорное желание фантазировать на темы. «Ах-ах-ах, вот тебе пример, там есть три действия подряд с одним условием, это такая прекрасная демонстрация». Только это — фэнтезийный сферовакуумный теоретический пример. На практике между этими тремя действиями есть толпа условий. Каждое следующее действие вполне может зависеть от результата предыдущего действия. И как решается это, ни ты, ни кто либо другой так и не осилили показать. Несмотря на все высокопарные и пафосные заявления.


    _>Ты действительно считаешь, что если в моём примере заменить

    _>
    _>X();
    _>Y();
    _>Z();
    _>

    _>на
    _>
    _>X();
    _>Y();
    _>if(complex_condition()) Z1();
    _>else Z2();
    _>

    _>то это вообще что-то изменит? )


    Я считаю, что ты неспособен решить мою задачу своим подходом именно из-за того, что:
    — в ней есть условия
    — ты не решаешь не мою задачу, а свои фантазии про мою задачу

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


    dmitriid.comGitHubLinkedIn
    Re[117]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 30.03.15 22:52
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ты уже определись, прочитаешь ты условие задачи, или нет.


    M>Это — отдельные операции над ордерами. Будут эти операции происходить или нет, зависит от различных предусловий. Будут ли происходить очередные операции, часто зависит от результата предыдущих операций.


    M>Мне уже надоело одно и то же писать разными предложениями. Твой примитивный пример и настойчивость, что все в мире является лишь последовательностью операций являются лишь теоретическими изысканиями и фантазиями на тему.


    ОК, это отдельные операции над ордерами. Тогда уточни какое именно поле в ордере может поменять операция risk check. Я что-то не нашёл этого в твоём описание задачи.


    M>Я считаю, что ты неспособен решить мою задачу своим подходом именно из-за того, что:

    M>- в ней есть условия
    M>- ты не решаешь не мою задачу, а свои фантазии про мою задачу

    M>Могу я увидеть решение хотя бы первого пункта моей задачи? В идеале — всех трех пунктов. Ведь как ты там пафосно заявлял? Твой подход подходит для любых задач?


    А чего там не хватает то до полной реализации первого пункта? ) Я уже забыл свой пример))) Кажется нет поля prepaid (потому как оно полностью аналогично по действию другому полю) и нет вызова risk_check (банально добавляется в if, т.к. является внешним вызовом). В остальном всё реализовано. Ты точно уверен, что мне очень сложно скопировать тот пример и добавить в него эти две строки? ))) Только вот непонятно ради чего это делать — только из-за твоей мании получить решение вот прямо твоей задачки?
    Re[118]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 31.03.15 07:13
    Оценка:
    M>>Мне уже надоело одно и то же писать разными предложениями. Твой примитивный пример и настойчивость, что все в мире является лишь последовательностью операций являются лишь теоретическими изысканиями и фантазиями на тему.

    _>ОК, это отдельные операции над ордерами. Тогда уточни какое именно поле в ордере может поменять операция risk check. Я что-то не нашёл этого в твоём описание задачи.


    Зачем тебе это? Задача составлена именно так, что бы ты, со своими заявлениями про стат. типизацию, мог ее решить так, как тебе удобно.


    M>>Я считаю, что ты неспособен решить мою задачу своим подходом именно из-за того, что:

    M>>- в ней есть условия
    M>>- ты не решаешь не мою задачу, а свои фантазии про мою задачу

    M>>Могу я увидеть решение хотя бы первого пункта моей задачи? В идеале — всех трех пунктов. Ведь как ты там пафосно заявлял? Твой подход подходит для любых задач?


    _>А чего там не хватает то до полной реализации первого пункта?


    всего. там нет решения первого пункта.

    _>) Я уже забыл свой пример))) Кажется нет поля prepaid (потому как оно полностью аналогично по действию другому полю) и нет вызова risk_check (банально добавляется в if, т.к. является внешним вызовом). В остальном всё реализовано. Ты точно уверен, что мне очень сложно скопировать тот пример и добавить в него эти две строки? )))


    Да, я уверен. Иначе ты (и другие) сделали бы это еще два месяца тому назад.


    dmitriid.comGitHubLinkedIn
    Re[119]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 31.03.15 16:44
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    _>>ОК, это отдельные операции над ордерами. Тогда уточни какое именно поле в ордере может поменять операция risk check. Я что-то не нашёл этого в твоём описание задачи.

    M>Зачем тебе это? Задача составлена именно так, что бы ты, со своими заявлениями про стат. типизацию, мог ее решить так, как тебе удобно.

    Что значит зачем мне это? Если risk check — это операция над ордером, то она вызывается одним способом. А если risk check — это всего лишь условие (не может ничего поменять в ордере), то совсем по другому и в другом месте. Ты уж определись.

    _>>А чего там не хватает то до полной реализации первого пункта?

    M>всего. там нет решения первого пункта.

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

    M>Да, я уверен. Иначе ты (и другие) сделали бы это еще два месяца тому назад.


    Ох, ты млин))) Ну что я могу сказать тут... Разве что "да на вот, подавись" ))))

    #include <stdexcept>
    #include <iostream>
    using namespace std;
    
    //Реализация пункта 1
    enum class OrderType {Unknown, OnlyDecrease, Constant};
    template<OrderType Type>
    struct Order{
        const int amount;
        const bool sent;
        const bool risk;
        const bool prepaid;
    };
    
    template<OrderType Type> bool RiskCheck(const Order<Type>& o) {return true;//реализация для примера}
    template<OrderType Type> auto RiskOrder(const Order<Type>& o) {return Order<OrderType::Constant>{o.amount, o.sent, true, o.prepaid};}
    template<OrderType Type> auto PayOrder(const Order<Type>& o) {return Order<OrderType::Constant>{o.amount, o.sent, o.risk, true};}
    template<OrderType Type> auto SendOrder(const Order<Type>& o) {return Order<Type==OrderType::Unknown?OrderType::OnlyDecrease:Type>{o.amount, true, o.risk, o.prepaid};}
    template<OrderType Type> auto Increase(const Order<Type>& o, int v)
    {
        static_assert(Type==OrderType::Unknown, "You can not increase this order");
        if(o.sent||o.risk||o.prepaid||!RiskCheck(o)) throw invalid_argument("You can not increase this order");
        else return Order<Type>{o.amount+v, o.sent, o.risk, o.prepaid};
    }
    template<OrderType Type> auto Decrease(const Order<Type>& o, int v)
    {
        static_assert(Type!=OrderType::Constant, "You can not decrease this order");
        if(Type==OrderType::Unknown&&(o.risk||o.prepaid)) throw invalid_argument("You can not decrease this order");
        else return Order<Type>{o.amount-v, o.sent, o.risk, o.prepaid};
    }
    
    //Проверка тестами
    template<OrderType Type, typename F> void ProcessOrder(const Order<Type>& o, F f)
    {
        cout<<"Process order:\t"<<o.amount<<'\t'<<o.sent<<'\t'<<o.risk<<'\t'<<o.prepaid<<endl;
        try{
            auto r=f(o);
            cout<<"Result order:\t"<<r.amount<<'\t'<<r.sent<<'\t'<<r.risk<<'\t'<<o.prepaid<<endl;
        }catch(const exception& e) {cout<<e.what()<<endl;}
    }
    
    int main()
    {
        ProcessOrder(Order<OrderType::Unknown>{100, false, false, false}, [](auto o){//нормально отрабатывает
            auto o1=Increase(o, 10);
            auto o2=SendOrder(o1);
            return Decrease(o2, 20);
        });
        ProcessOrder(Order<OrderType::Unknown>{100, true, false, false}, [](auto o){//вылетает с исключением в рантайме - плохой входящий ордер для такого алгоритма
            auto o1=Increase(o, 10);
            auto o2=SendOrder(o1);
            return Decrease(o2, 20);
        });
        ProcessOrder(Order<OrderType::Unknown>{100, false, false, false}, [](auto o){//некомпилируется - компилятор видит ошибку в бизнес логике алгоритма
            auto o1=Decrease(o, 20);
            auto o2=SendOrder(o1);
            return Increase(o2, 10);
        });
    }


    Реально пришлось добавить пару элементарных строк в пример, чтобы добить его до полной реализации пункта 1 задачки...
    Re[120]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 01.04.15 05:37
    Оценка:
    _>Что значит зачем мне это? Если risk check — это операция над ордером, то она вызывается одним способом. А если risk check — это всего лишь условие (не может ничего поменять в ордере), то совсем по другому и в другом месте. Ты уж определись.

    1. У тебя же хваленая стат. типизация, в которой ты можешь создавать любые типы и т.п. Зачем тебе знать, изменяется заказ или нет? Вообще-то, условий в задаче вполне достаточно, чтобы решить ее. Я все больше убеждаюсь, что ты не имеешь ни малейшего представления, как ее решить, и хочешь, чтобы я ее решил за тебя
    2. Бинарная логика во все поля. Или действие, или условие. Или меняем, или не меняем. После этого люди еще обижаются, когда я их сугубыми теоретиками называю. Потому что в реальном мире, отражением которого является моя задача, такого бинарного разделения не существует. И ты бы это увидел, если бы задался целью прочитать и понять задачу. Могу только процитировать сам себя:

    Это — отдельные операции над ордерами. Будут эти операции происходить или нет, зависит от различных предусловий. Будут ли происходить очередные операции, часто зависит от результата предыдущих операций.


    _>>>А чего там не хватает то до полной реализации первого пункта?

    M>>всего. там нет решения первого пункта.

    _>Ну ну) На мой взгляд тут даже начинающий программист смог бы увидеть, что в предложенном примере продемонстрированы все необходимые концепции для реализации твоей задачки. ) Ну если ты не можешь, то...


    Концепции — это сугубая теория. Которая пока разбивается о практику.

    M>>Да, я уверен. Иначе ты (и другие) сделали бы это еще два месяца тому назад.

    _>Ох, ты млин))) Ну что я могу сказать тут... Разве что "да на вот, подавись" ))))

      Скрытый текст
    _>
    _>#include <stdexcept>
    _>#include <iostream>
    _>using namespace std;
    
    _>//Реализация пункта 1
    _>enum class OrderType {Unknown, OnlyDecrease, Constant};
    _>template<OrderType Type>
    _>struct Order{
    _>    const int amount;
    _>    const bool sent;
    _>    const bool risk;
    _>    const bool prepaid;
    _>};
    
    _>template<OrderType Type> bool RiskCheck(const Order<Type>& o) {return true;//реализация для примера}
    _>template<OrderType Type> auto RiskOrder(const Order<Type>& o) {return Order<OrderType::Constant>{o.amount, o.sent, true, o.prepaid};}
    _>template<OrderType Type> auto PayOrder(const Order<Type>& o) {return Order<OrderType::Constant>{o.amount, o.sent, o.risk, true};}
    _>template<OrderType Type> auto SendOrder(const Order<Type>& o) {return Order<Type==OrderType::Unknown?OrderType::OnlyDecrease:Type>{o.amount, true, o.risk, o.prepaid};}
    _>template<OrderType Type> auto Increase(const Order<Type>& o, int v)
    _>{
    _>    static_assert(Type==OrderType::Unknown, "You can not increase this order");
    _>    if(o.sent||o.risk||o.prepaid||!RiskCheck(o)) throw invalid_argument("You can not increase this order");
    _>    else return Order<Type>{o.amount+v, o.sent, o.risk, o.prepaid};
    _>}
    _>template<OrderType Type> auto Decrease(const Order<Type>& o, int v)
    _>{
    _>    static_assert(Type!=OrderType::Constant, "You can not decrease this order");
    _>    if(Type==OrderType::Unknown&&(o.risk||o.prepaid)) throw invalid_argument("You can not decrease this order");
    _>    else return Order<Type>{o.amount-v, o.sent, o.risk, o.prepaid};
    _>}
    
    _>//Проверка тестами
    _>template<OrderType Type, typename F> void ProcessOrder(const Order<Type>& o, F f)
    _>{
    _>    cout<<"Process order:\t"<<o.amount<<'\t'<<o.sent<<'\t'<<o.risk<<'\t'<<o.prepaid<<endl;
    _>    try{
    _>        auto r=f(o);
    _>        cout<<"Result order:\t"<<r.amount<<'\t'<<r.sent<<'\t'<<r.risk<<'\t'<<o.prepaid<<endl;
    _>    }catch(const exception& e) {cout<<e.what()<<endl;}
    _>}
    
    _>int main()
    _>{
    _>    ProcessOrder(Order<OrderType::Unknown>{100, false, false, false}, [](auto o){//нормально отрабатывает
    _>        auto o1=Increase(o, 10);
    _>        auto o2=SendOrder(o1);
    _>        return Decrease(o2, 20);
    _>    });
    _>    ProcessOrder(Order<OrderType::Unknown>{100, true, false, false}, [](auto o){//вылетает с исключением в рантайме - плохой входящий ордер для такого алгоритма
    _>        auto o1=Increase(o, 10);
    _>        auto o2=SendOrder(o1);
    _>        return Decrease(o2, 20);
    _>    });
    _>    ProcessOrder(Order<OrderType::Unknown>{100, false, false, false}, [](auto o){//некомпилируется - компилятор видит ошибку в бизнес логике алгоритма
    _>        auto o1=Decrease(o, 20);
    _>        auto o2=SendOrder(o1);
    _>        return Increase(o2, 10);
    _>    });
    _>}


    _>Реально пришлось добавить пару элементарных строк в пример, чтобы добить его до полной реализации пункта 1 задачки...


    И ты опять реально не осилил даже прочитать условие задачи. Нет, твоя задача не решает первый пункт. Вот интересно, поймешь ли ты это.

    Ну и да. Я правильно понимаю, что RiskCheck происходит все равно в рантайме?


    dmitriid.comGitHubLinkedIn
    Re[121]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 01.04.15 15:35
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    _>>Что значит зачем мне это? Если risk check — это операция над ордером, то она вызывается одним способом. А если risk check — это всего лишь условие (не может ничего поменять в ордере), то совсем по другому и в другом месте. Ты уж определись.

    M>1. У тебя же хваленая стат. типизация, в которой ты можешь создавать любые типы и т.п. Зачем тебе знать, изменяется заказ или нет? Вообще-то, условий в задаче вполне достаточно, чтобы решить ее. Я все больше убеждаюсь, что ты не имеешь ни малейшего представления, как ее решить, и хочешь, чтобы я ее решил за тебя

    Бредим? ) И даже не читаем то, на что отвечаем? )

    M>2. Бинарная логика во все поля. Или действие, или условие. Или меняем, или не меняем. После этого люди еще обижаются, когда я их сугубыми теоретиками называю. Потому что в реальном мире, отражением которого является моя задача, такого бинарного разделения не существует. И ты бы это увидел, если бы задался целью прочитать и понять задачу.


    Угу, понятно, в твоём очаровательном мире все вокруг ходят слегка беременные. )

    M>Могу только процитировать сам себя:

    M>Это — отдельные операции над ордерами. Будут эти операции происходить или нет, зависит от различных предусловий. Будут ли происходить очередные операции, часто зависит от результата предыдущих операций.


    Да причём тут условия, при которых выполняется данная функция. Это ни на что не влияет. Я тебе спрашиваю, меняет эта функция при своём исполнение ордер или нет. И ты почему-то не в силах ответить на такой простейший вопрос уже который раз.

    _>>Реально пришлось добавить пару элементарных строк в пример, чтобы добить его до полной реализации пункта 1 задачки...

    M>И ты опять реально не осилил даже прочитать условие задачи. Нет, твоя задача не решает первый пункт. Вот интересно, поймешь ли ты это.

    Ну давай, расскажи, что ты ещё пытаешься изобрести, чтобы не признавать очевидного... )

    M>Ну и да. Я правильно понимаю, что RiskCheck происходит все равно в рантайме?


    Где тебе надо будет, там и будет, в зависимости от реального кода. У меня в примере там вообще константа возвращается, и понятно , что компилятор делает с таким кодом. )))
    Re[122]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 05.04.15 18:58
    Оценка:
    M>>1. У тебя же хваленая стат. типизация, в которой ты можешь создавать любые типы и т.п. Зачем тебе знать, изменяется заказ или нет? Вообще-то, условий в задаче вполне достаточно, чтобы решить ее. Я все больше убеждаюсь, что ты не имеешь ни малейшего представления, как ее решить, и хочешь, чтобы я ее решил за тебя

    _>Бредим? ) И даже не читаем то, на что отвечаем? )


    Читаем. После хваленого «мой подход подходит везде» ты пытаешься решить не поставленную задачу, а сугубо игрушечную задачу, котору ты можешь решить. Тебя вообще не должно волновать, изменяется заказ или нет


    M>>2. Бинарная логика во все поля. Или действие, или условие. Или меняем, или не меняем. После этого люди еще обижаются, когда я их сугубыми теоретиками называю. Потому что в реальном мире, отражением которого является моя задача, такого бинарного разделения не существует. И ты бы это увидел, если бы задался целью прочитать и понять задачу.


    _>Угу, понятно, в твоём очаровательном мире все вокруг ходят слегка беременные. )



    Нет. В моем реальном мире происходит то, что я описал. И задача была приведена из реального мира. Прекрасно, что за два месяца сугубые теоретики типа тебя не осилили даже первый пункт из нее.

    M>>Могу только процитировать сам себя:

    M>>Это — отдельные операции над ордерами. Будут эти операции происходить или нет, зависит от различных предусловий. Будут ли происходить очередные операции, часто зависит от результата предыдущих операций.


    _>Да причём тут условия, при которых выполняется данная функция. Это ни на что не влияет.


    если ни на что не влияет, где решение?

    _>Я тебе спрашиваю, меняет эта функция при своём исполнение ордер или нет. И ты почему-то не в силах ответить на такой простейший вопрос уже который раз.


    Ты не можешь ответить на простейишй вопрос: зачем тебе это знать?

    Более того, все действия, что там описаны, могут менять заказ, а могут не менять

    _>>>Реально пришлось добавить пару элементарных строк в пример, чтобы добить его до полной реализации пункта 1 задачки...

    M>>И ты опять реально не осилил даже прочитать условие задачи. Нет, твоя задача не решает первый пункт. Вот интересно, поймешь ли ты это.
    _>Ну давай, расскажи, что ты ещё пытаешься изобрести, чтобы не признавать очевидного... )

    Очевидное ровно одно: твоя задача не выполняет даже первого пункта задачи. Просто пройдись по каждому пункту в первом шаге и скажи сам себе, выполняет ли его твое «решение». Ах да, я забыл, ты не сможешь на это ответить, потому что тебе с какого-то перепугу надо знать, меняют действия заказ или не меняют

    M>>Ну и да. Я правильно понимаю, что RiskCheck происходит все равно в рантайме?

    _>Где тебе надо будет, там и будет, в зависимости от реального кода.

    Ага. Демагогия.

    _>У меня в примере там вообще константа возвращается, и понятно , что компилятор делает с таким кодом. )))


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


    dmitriid.comGitHubLinkedIn
    Re[123]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 06.04.15 00:44
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Читаем. После хваленого «мой подход подходит везде» ты пытаешься решить не поставленную задачу, а сугубо игрушечную задачу, котору ты можешь решить. Тебя вообще не должно волновать, изменяется заказ или нет


    Почему это не должно меня волновать? И твоя задача (в рамках пункта1) вполне себе решена.

    _>>Я тебе спрашиваю, меняет эта функция при своём исполнение ордер или нет. И ты почему-то не в силах ответить на такой простейший вопрос уже который раз.

    M>Ты не можешь ответить на простейишй вопрос: зачем тебе это знать?

    Как это зачем? Чтобы понять, является risk_check операцией надо ордером или же является просто условием для выполнения другой операции. Эти разные абстракции отражены у меня в коде разными сущностями.

    M>Более того, все действия, что там описаны, могут менять заказ, а могут не менять


    Т.е. ты хочешь сказать что могут? Тогда почему в условие задачи у тебя написано " если сумма увеличивается, мы должны провести risk check. если risk check не проходит, товар никак не помечается, но изменение суммы не проходит"? Судя по этой цитате risk_check является классическим условием для операции увеличения суммы. Т.е. изначально в задаче у тебя всё нормально сформулировано. А вот потом (когда тебе уже показали несколько разных решений), в обсуждение, ты начал придумывать что risk_check — это независимая операция над ордером и т.п. Так ты всё же определись как оно. Если как в начальном описание задачи, то решения тебе показали. Если же твоё начальное описание неверно и risk_check является операцией, то тогда решения надо чуть переделать.

    M>Очевидное ровно одно: твоя задача не выполняет даже первого пункта задачи. Просто пройдись по каждому пункту в первом шаге и скажи сам себе, выполняет ли его твое «решение». Ах да, я забыл, ты не сможешь на это ответить, потому что тебе с какого-то перепугу надо знать, меняют действия заказ или не меняют


    Да, надо знать. ) Но данное решение написано в предположение что не меняет (как и указано у тебя описание задачи). И мне можно не проходить по пунктам задачи, потому как я предоставил компилируемый пример, который проходит нужные тесты. А от тебя пока видна только пустая болтовня.
    Re[124]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 07.04.15 16:40
    Оценка:
    _>Почему это не должно меня волновать? И твоя задача (в рамках пункта1) вполне себе решена.

    В общем, можно этот бессмысленный спор можно прекращать. Если ты не осилил даже понять и решить даже первый пункт моей задачи, то о чем идет речь? Только о твоей демагогии и пафосных «мой подход работает везде».

    Ну да. Неумение за два месяца решить простейшую задачу действительно работает везде


    dmitriid.comGitHubLinkedIn
    Re[125]: Haskell нужен! (в Standard Chartered Bank)
    От: alex_public  
    Дата: 07.04.15 23:57
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>В общем, можно этот бессмысленный спор можно прекращать. Если ты не осилил даже понять и решить даже первый пункт моей задачи, то о чем идет речь? Только о твоей демагогии и пафосных «мой подход работает везде».


    M>Ну да. Неумение за два месяца решить простейшую задачу действительно работает везде


    Слив засчитан.
    Re[126]: Haskell нужен! (в Standard Chartered Bank)
    От: Mamut Швеция http://dmitriid.com
    Дата: 08.04.15 11:24
    Оценка:
    M>>В общем, можно этот бессмысленный спор можно прекращать. Если ты не осилил даже понять и решить даже первый пункт моей задачи, то о чем идет речь? Только о твоей демагогии и пафосных «мой подход работает везде».

    M>>Ну да. Неумение за два месяца решить простейшую задачу действительно работает везде


    _>Слив засчитан.


    Твой (и не только твой)? Безусловно. Длинный двухмесячный слив. Если не учитывать споры про Оберон, это — по-моему, рекорд по длительности.


    dmitriid.comGitHubLinkedIn
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.