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