Size: a a a

2021 March 18

JS

Jerzy Syrowiecki in Haskell Start
или putStr "hello" — бери и печатай сразу
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
а ящик (box) действительно присутствует
А получается что evaluation выдает в качестве результата такой ящик, где либо хранится вычисленное значение, либо exception (если в процессе вычисления наткнулся на throw) и все последующие, верхние вычисления с использованием этого бажного вычисления будут тупо брать этот exception и выдавать как свой результат? А на этапе вычисления можно отловить эти вычисления? Ну типа, да, вычисления, да есть exception, но вот где-то дальше там по ходу вычисления есть аля-catch и вычислятор смотрит, а что там за catch и дергает его и если не сложилось, то продолжает протакливать исключение выше. Или же вычислятор этим не парится и говорит, что нах, результат всего вычисления есть исключение и ты, executor сам парся с ним, ищи catch и пропихивай и сам решай что исполнять. Но в этом случае получается я всю муть с глубины должен поднимать на уровень IO?
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
А получается что evaluation выдает в качестве результата такой ящик, где либо хранится вычисленное значение, либо exception (если в процессе вычисления наткнулся на throw) и все последующие, верхние вычисления с использованием этого бажного вычисления будут тупо брать этот exception и выдавать как свой результат? А на этапе вычисления можно отловить эти вычисления? Ну типа, да, вычисления, да есть exception, но вот где-то дальше там по ходу вычисления есть аля-catch и вычислятор смотрит, а что там за catch и дергает его и если не сложилось, то продолжает протакливать исключение выше. Или же вычислятор этим не парится и говорит, что нах, результат всего вычисления есть исключение и ты, executor сам парся с ним, ищи catch и пропихивай и сам решай что исполнять. Но в этом случае получается я всю муть с глубины должен поднимать на уровень IO?
если исключение происходит, то значение в коробке не возвращается
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
А получается что evaluation выдает в качестве результата такой ящик, где либо хранится вычисленное значение, либо exception (если в процессе вычисления наткнулся на throw) и все последующие, верхние вычисления с использованием этого бажного вычисления будут тупо брать этот exception и выдавать как свой результат? А на этапе вычисления можно отловить эти вычисления? Ну типа, да, вычисления, да есть exception, но вот где-то дальше там по ходу вычисления есть аля-catch и вычислятор смотрит, а что там за catch и дергает его и если не сложилось, то продолжает протакливать исключение выше. Или же вычислятор этим не парится и говорит, что нах, результат всего вычисления есть исключение и ты, executor сам парся с ним, ищи catch и пропихивай и сам решай что исполнять. Но в этом случае получается я всю муть с глубины должен поднимать на уровень IO?
на этапе вычисления ловить исключения нельзя
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
А получается что evaluation выдает в качестве результата такой ящик, где либо хранится вычисленное значение, либо exception (если в процессе вычисления наткнулся на throw) и все последующие, верхние вычисления с использованием этого бажного вычисления будут тупо брать этот exception и выдавать как свой результат? А на этапе вычисления можно отловить эти вычисления? Ну типа, да, вычисления, да есть exception, но вот где-то дальше там по ходу вычисления есть аля-catch и вычислятор смотрит, а что там за catch и дергает его и если не сложилось, то продолжает протакливать исключение выше. Или же вычислятор этим не парится и говорит, что нах, результат всего вычисления есть исключение и ты, executor сам парся с ним, ищи catch и пропихивай и сам решай что исполнять. Но в этом случае получается я всю муть с глубины должен поднимать на уровень IO?
но есть Either, который можно вычислять и который ведёт себя почти так же, как исключение
источник

JS

Jerzy Syrowiecki in Haskell Start
можно муть поднимать в IO с помощью исключений, можно обрабатывать ошибки в чистом коде с помощью чистых данных
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
но есть Either, который можно вычислять и который ведёт себя почти так же, как исключение
Про Either у Карпова:
we could quickly find ourselves writing all our code in Maybe or Either monads and corresponding transformers
источник

S

Sergey in Haskell Start
Какой путь считается более идеоматичным?
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
на этапе вычисления ловить исключения нельзя
А зачем тогда MonadError.catchError, у него вроде тип подходящий m a -> (e -> m a) -> m a, без IO?
источник

JS

Jerzy Syrowiecki in Haskell Start
Sergey
Какой путь считается более идеоматичным?
оба идиоматичны для разных видов ошибок
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
А зачем тогда MonadError.catchError, у него вроде тип подходящий m a -> (e -> m a) -> m a, без IO?
чтобы строить псевдоисключения не только в Either, но в разных монадах
источник

JS

Jerzy Syrowiecki in Haskell Start
а также чтобы ловить настоящие IO исключения в монадах, производных от IO
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
а также чтобы ловить настоящие IO исключения в монадах, производных от IO
Что значит "производные от IO"? Это которые навешаны с помощью механизма трансформеров на IO, типа ReaderT r IO a?
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
чтобы строить псевдоисключения не только в Either, но в разных монадах
Блин, псевдоисключения еще. Новое понятие. Это имеется ввиду те, которые не наследуются от Exception, а произвольные, типа строки, числа, все что хочется?
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
Что значит "производные от IO"? Это которые навешаны с помощью механизма трансформеров на IO, типа ReaderT r IO a?
да
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
Блин, псевдоисключения еще. Новое понятие. Это имеется ввиду те, которые не наследуются от Exception, а произвольные, типа строки, числа, все что хочется?
нет, я имел в виду поведение, аналогичное механизму исключений
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
нет, я имел в виду поведение, аналогичное механизму исключений
А, я понял. Такой объединяющий/объясняющий всё механизм, где мы нашей новой собственной монаде прописываем способность "генерить" исключения, а в catchError мы не паримся с pattern matching-ом, вообще ничего не знаем про внутреннее устройство этой новой монады (как в случае Either), а работаем с чистым исключением, а всю работу за нас делает instance монады. И Either это просто разновидность MonadError. И судя по instance MonadError IOException IO можно в IO монаде делать catch, а можно catchError ?
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
А, я понял. Такой объединяющий/объясняющий всё механизм, где мы нашей новой собственной монаде прописываем способность "генерить" исключения, а в catchError мы не паримся с pattern matching-ом, вообще ничего не знаем про внутреннее устройство этой новой монады (как в случае Either), а работаем с чистым исключением, а всю работу за нас делает instance монады. И Either это просто разновидность MonadError. И судя по instance MonadError IOException IO можно в IO монаде делать catch, а можно catchError ?
всё так
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
всё так
Круто. Спасибо.
источник

JS

Jerzy Syrowiecki in Haskell Start
там ещё есть MonadError, которая более общий интерфейс, есть MonadThrow/MonadCatch, которые дают более гранулярный интерфейс и работают только с базовыми исключениями
источник