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 приписывает своему коду свойства, которых там и в помине нет. И вы его зачем-то поддерживаете
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.