Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, korvin_, Вы писали:
_>>Что именно? OOM там не ловится никак. То же самое с SO — это внутренняя вещь рантайма.
S>Ну, то есть panic. Скажем так: в такой среде сложно писать софт, который должен работать 24*7.
Вот интересно, а что вы делаете в Java при получении OOM?
_>>В остальном — по-разному. Например, функция div имеет тип (Integral a => a -> a -> a) без указания какого либо исключения деления на 0, но исключение может возникнуть.
S>Хм. То есть кидать можно всё, что угодно и где угодно?
S>Я посмотрел вот сюда. Написано
S>S>The great thing about Haskell is that it is not necessary to hard-wire the exception handling into the language.
S>То есть исключений нет, но если хочется прикрутить их поддержку, то можно их реализовать самостоятельно.
S>Читаем дальше:
S>S>Haskell solves the problem a diplomatic way: Functions return error codes, but the handling of error codes does not uglify the calling code.
S>Там написана неправда?
Там написано не про это. Насчёт does not uglify the calling code я бы поспорил.
_>>Ну не совсем.
S>>>А что произойдёт, если хаскелл не смог сконструировать Add из Expr и Expr из-за OutOfMemory или StackOverflow?
_>>Упадёт.
S>Как-то грустненько.
А что вы предлагаете делать при OOM?
S>>>Почему нельзя было просто добавить OOM в определение Expr как одной из альтернатив?
_>>Потому что OOM — это не часть Expr. Сигнатуры в примере с OOM вымышленные.
_>>Что нам даст добавление OOM в качестве альтернативы?
_>>Эти альтернативы -- просто конструкторы значений.
S>А выглядит как алгебраический тип.
Это алгебраический тип, но при чём тут это?
_>>Всё равно, что в Java написать
_>>_>>var oom = new SomeInterface() {
_>> ...
_>>};
_>>
_>>Как это поможет?
S>Поможет не писать везде Expr | OOM, а встроить OOM в Expr.
И что с ним делать в Expr? Давайте добавим. Как это отразится на expr0? Что вообще дальше делать с этим OOM?
_>>_>>expr0 = If (Mul ...) ... -- где здесь OOM?
_>>
S>В рамках Haskell, наверное, нигде. Язык не готов к работе в условиях дефицита памяти
Где бы он был в Java?
_>>IO так и делает: бросает исключения без указания в сигнатуре.
S>Ну, то есть в IO встроена возможность бросать всё что угодно? откуда в div появилась возможность "бросить" divisionByZero?
Нет, там какая-то чёрная магия с примитивами:
https://hackage.haskell.org/package/ghc-prim-0.13.0/docs/src/GHC.Prim.html#raise%23