Информация об изменениях

Сообщение Re[12]: Result objects - все-таки победили Exceptions? от 10.01.2025 9:53

Изменено 10.01.2025 9:57 korvin_

Re[12]: Result objects - все-таки победили Exceptions?
Здравствуйте, Sinclair, Вы писали:

_>>И как это должно выглядеть?

S>Давайте повернём вопрос в другую сторону: а как это сделано в Haskell?

Что именно? OOM там не ловится никак. То же самое с SO — это внутренняя вещь рантайма.

В остальном — по-разному. Например, функция div имеет тип (Integral a => a -> a -> a) без указания какого либо исключения деления на 0, но исключение может возникнуть.

main :: IO ()
main = print $ 5 `div` 0

— никакого упоминания исключений.

Можно и перехватить:

import Control.Exception
 
test :: IO ()
test = print $ 5 `div` 0
 
main :: IO ()
main = catch test handler
    where
        handler :: SomeException -> IO ()
        handler ex = putStrLn $ "Caught exception: " ++ show ex


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


Ну не совсем.

S>А что произойдёт, если хаскелл не смог сконструировать Add из Expr и Expr из-за OutOfMemory или StackOverflow?


Упадёт.

_>>-- ну и print, конечно, должен иметь сигнатуру вида

_>>-- print :: Show a => (a | OOM) -> (IO () | OOM)
_>>[/haskell]

_>>То есть фактически OOM придётся писать буквально везде. Добавим сюда также StackOverflow, DivisionByZero и чёрт знает что ещё.

S>Я не очень понимаю, почему нам придётся писать OOM буквально везде. В первом варианте вы не писали никаких сигнатур у Add Expr Expr, а добавление OOM почему-то его потребовало.
S>Почему нельзя было просто добавить OOM в определение Expr как одной из альтернатив?

Потому что OOM — это не часть Expr. Сигнатуры в примере с OOM вымышленные.
Что нам даст добавление OOM в качестве альтернативы?

expr0 = If (Mul ...) ... -- где здесь OOM?


_>>Удачи убедить хоть кого-нибудь писать на таком языке, да и самому не свихнуться от такого.

S>На первый взгляд, Хаскелл как раз такой язык. В том смысле, что я не могу просто взять и сделать throw в произвольном месте, не меняя сигнатуру функции (как это сделано в C++ и C#)
IO так и делает: бросает исключения без указания в сигнатуре.
Re[12]: Result objects - все-таки победили Exceptions?
Здравствуйте, Sinclair, Вы писали:

_>>И как это должно выглядеть?

S>Давайте повернём вопрос в другую сторону: а как это сделано в Haskell?

Что именно? OOM там не ловится никак. То же самое с SO — это внутренняя вещь рантайма.

В остальном — по-разному. Например, функция div имеет тип (Integral a => a -> a -> a) без указания какого либо исключения деления на 0, но исключение может возникнуть.

main :: IO ()
main = print $ 5 `div` 0

— никакого упоминания исключений.

Можно и перехватить:

import Control.Exception
 
test :: IO ()
test = print $ 5 `div` 0
 
main :: IO ()
main = catch test handler
    where
        handler :: SomeException -> IO ()
        handler ex = putStrLn $ "Caught exception: " ++ show ex


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


Ну не совсем.

S>А что произойдёт, если хаскелл не смог сконструировать Add из Expr и Expr из-за OutOfMemory или StackOverflow?


Упадёт.

_>>-- ну и print, конечно, должен иметь сигнатуру вида

_>>-- print :: Show a => (a | OOM) -> (IO () | OOM)
_>>[/haskell]

_>>То есть фактически OOM придётся писать буквально везде. Добавим сюда также StackOverflow, DivisionByZero и чёрт знает что ещё.

S>Я не очень понимаю, почему нам придётся писать OOM буквально везде. В первом варианте вы не писали никаких сигнатур у Add Expr Expr, а добавление OOM почему-то его потребовало.
S>Почему нельзя было просто добавить OOM в определение Expr как одной из альтернатив?

Потому что OOM — это не часть Expr. Сигнатуры в примере с OOM вымышленные.
Что нам даст добавление OOM в качестве альтернативы?

Эти альтернативы -- просто конструкторы значений.

Всё равно, что в Java написать

var oom = new SomeInterface() {
    ...
};


Как это поможет?

expr0 = If (Mul ...) ... -- где здесь OOM?


_>>Удачи убедить хоть кого-нибудь писать на таком языке, да и самому не свихнуться от такого.

S>На первый взгляд, Хаскелл как раз такой язык. В том смысле, что я не могу просто взять и сделать throw в произвольном месте, не меняя сигнатуру функции (как это сделано в C++ и C#)
IO так и делает: бросает исключения без указания в сигнатуре.