Сообщение 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, но исключение может возникнуть.
— никакого упоминания исключений.
Можно и перехватить:
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 в качестве альтернативы?
_>>Удачи убедить хоть кого-нибудь писать на таком языке, да и самому не свихнуться от такого.
S>На первый взгляд, Хаскелл как раз такой язык. В том смысле, что я не могу просто взять и сделать throw в произвольном месте, не меняя сигнатуру функции (как это сделано в C++ и C#)
IO так и делает: бросает исключения без указания в сигнатуре.
_>>И как это должно выглядеть?
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 exS>Я бегло почитал — ребята пишут, что исключения не требуют специальной языковой поддержки, т.к. для них достаточно монад. Ну, ок.
Ну не совсем.
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, но исключение может возникнуть.
— никакого упоминания исключений.
Можно и перехватить:
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 написать
Как это поможет?
_>>Удачи убедить хоть кого-нибудь писать на таком языке, да и самому не свихнуться от такого.
S>На первый взгляд, Хаскелл как раз такой язык. В том смысле, что я не могу просто взять и сделать throw в произвольном месте, не меняя сигнатуру функции (как это сделано в C++ и C#)
IO так и делает: бросает исключения без указания в сигнатуре.
_>>И как это должно выглядеть?
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 exS>Я бегло почитал — ребята пишут, что исключения не требуют специальной языковой поддержки, т.к. для них достаточно монад. Ну, ок.
Ну не совсем.
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 так и делает: бросает исключения без указания в сигнатуре.