Сообщение Re[19]: Haskell нужен! (в Standard Chartered Bank) от 04.02.2015 13:14
Изменено 04.02.2015 13:40 Mamut [ищите в других сетях]
ARK>Рассматриваю для простоты только первые две строчки.
Действительно. Дальше же работа с конфигурацией идет, там уже все не так весело
ARK>Псевдокод:
ARK>
Чем это принципиально отличается от API с такими же условиями?
Да-да. Error. Потому что в реальности все так и происходит, ага-ага
В реальности происходит так:
Ой. Внезапно на этапе компиляции мы даже не знаем, будет заказ отправелнным или неотправленным. Какая печаль!
ARK>Таким образом, тут мы "закодировали в типах" требование "Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа". Компилятор запрещает нарушать его.
Вау. Ага. Так как мне поможет компилятор в тех двух строчках кода, что я привел?
ARK>Могли ли мы ошибиться при реализации этого требования? Могли.
Я об этом (среди прочего) и говорю уже пятнадцать сообщения подряд Нет, «магический тайпчекер все проверит»
ARK>Но все равно существует вероятность обнаружения ошибки компилятором, есть шанс, что где-то какие-то типы "не срастутся".
«Есть вероятность», «есть шанс»... Это не аргументы — это вера.
ARK>В данном случае, чтобы компилятор ничего не заподозрил, нам пришлось бы ошибиться сразу в двух сигнатурах функций (в SendOrder+ChangeOrderSum, или в ChangeOrderSum+PrintOrderDetails). Но, конечно, какая-то "отладка типов" тоже нужна, да.
Какая? Я уже пятнадцать раз спросил, как, реализовав логику на типах, люди собираются ее проверять?
Действительно. Дальше же работа с конфигурацией идет, там уже все не так весело
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),
checnge_order_amount(Order, Amount).
Ой. Внезапно на этапе компиляции мы даже не знаем, будет заказ отправелнным или неотправленным. Какая печаль!
ARK>Таким образом, тут мы "закодировали в типах" требование "Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа". Компилятор запрещает нарушать его.
Вау. Ага. Так как мне поможет компилятор в тех двух строчках кода, что я привел?
ARK>Могли ли мы ошибиться при реализации этого требования? Могли.
Я об этом (среди прочего) и говорю уже пятнадцать сообщения подряд Нет, «магический тайпчекер все проверит»
ARK>Но все равно существует вероятность обнаружения ошибки компилятором, есть шанс, что где-то какие-то типы "не срастутся".
«Есть вероятность», «есть шанс»... Это не аргументы — это вера.
ARK>В данном случае, чтобы компилятор ничего не заподозрил, нам пришлось бы ошибиться сразу в двух сигнатурах функций (в SendOrder+ChangeOrderSum, или в ChangeOrderSum+PrintOrderDetails). Но, конечно, какая-то "отладка типов" тоже нужна, да.
Какая? Я уже пятнадцать раз спросил, как, реализовав логику на типах, люди собираются ее проверять?
Re[19]: Haskell нужен! (в Standard Chartered Bank)
ARK>Рассматриваю для простоты только первые две строчки.
Действительно. Дальше же работа с конфигурацией идет, там уже все не так весело
ARK>Псевдокод:
ARK>
Чем это принципиально отличается от API с такими же условиями?
Да-да. Error. Потому что в реальности все так и происходит, ага-ага
В реальности происходит так:
Ой. Внезапно на этапе компиляции мы даже не знаем, будет заказ отправелнным или неотправленным. Какая печаль!
ARK>Таким образом, тут мы "закодировали в типах" требование "Пока заказ не помечен, как отправленный, можно уменьшать и увеличивать сумму заказа". Компилятор запрещает нарушать его.
Вау. Ага. Так как мне поможет компилятор в тех двух строчках кода, что я привел?
ARK>Могли ли мы ошибиться при реализации этого требования? Могли.
Я об этом (среди прочего) и говорю уже пятнадцать сообщения подряд Нет, «магический тайпчекер все проверит»
ARK>Но все равно существует вероятность обнаружения ошибки компилятором, есть шанс, что где-то какие-то типы "не срастутся".
«Есть вероятность», «есть шанс»... Это не аргументы — это вера.
ARK>В данном случае, чтобы компилятор ничего не заподозрил, нам пришлось бы ошибиться сразу в двух сигнатурах функций (в SendOrder+ChangeOrderSum, или в ChangeOrderSum+PrintOrderDetails). Но, конечно, какая-то "отладка типов" тоже нужна, да.
Какая? Я уже пятнадцать раз спросил, как, реализовав логику на типах, люди собираются ее проверять?
Действительно. Дальше же работа с конфигурацией идет, там уже все не так весело
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). Но, конечно, какая-то "отладка типов" тоже нужна, да.
Какая? Я уже пятнадцать раз спросил, как, реализовав логику на типах, люди собираются ее проверять?