Андрей
ghc сейчас их вываливает 12
Anonymous
Alexander
я тебе написал как не описывать все варианты
Alexander
выше
Alexander
полный код
Андрей
Anonymous
в плане?
Ну ты то в скале, то ещё где-то )
Андрей
я везде кроме руби)
Андрей
вообще пару месяцев, а что?
Андрей
@gurinderu отвечай, собака
Anonymous
Прост
Anonymous
Все, я не отвечаю 4 часа)
Alexander
A Z вообще проще полный код на гист, чтобы ответ воспринимался и можно было просто запустить
Alexander
а так show.SomeException это универсальный способ превратить в строку любое исклбчение
Alexander
если у тебя уже используются расширяемые исключения, то просто show
Alexander
но судя по тому, что у тебя Either e x результат, то у тебя уже есть какие-то обертки вокруг
Alexander
угадать без гиста которые тяжело
Андрей
угадать без гиста которые тяжело
указание одного типа ошибок помогло
Андрей
я почему-то думал, что ghc настолько строг, что проверит все возможные варианты
Андрей
или потребует их всех
Alexander
что значит все возможные варианты?
Alexander
смотри, что значит f :: Exception e => IO (Either e A)?
Андрей
ну вот я добавил ghc-options: -fprint-potential-instances и получал 12 потенциальных типиов, половина из них конечно стандартные, остальная часть вроде как по смыслу подходит
Андрей
то есть http ошибки
Alexander
это значит что есть функция f которая может вернуть значение e _которое потребует юзер_
Alexander
не, какое решит f, а какое попросит юзер
Alexander
т.е. тот кто пускает функцию выбирает e
Alexander
т.е. эта сигнатура, врятли верная в принципе
Alexander
как это может работать
Андрей
мне нужно сделать более конекретные тип ошибки я правильно тебя понял?
Alexander
не знаю :) я не знаю твоей задачи, сейчас напишу возможности, ты сам выберешь
Alexander
т.е. если у тебя f определяет исключение можно сделать свой sum type для ошибок
Alexander
если выбор пользователем это нормально (там внутри try)
Alexander
то делаешь новую сумму исключение data MyException
Alexander
и пишешь ему руками instance Exception, где описываешь fromException, который из SomeException ловит интересные тебе
Alexander
тогда заработает f >>= \case { Right x -> pure x; Left e@MyException{} -> show e}
Alexander
как работает SomeExeption
Андрей
у меня внутри f могут происходить ошибки с двух разных библиотек, которые вообще никак не связанны, и те и другие используют Control.Exception я наивно подумал, что Control.Exception это общий интерфейс для всего, что только могут написать
Alexander
data SomeException = forall e . Exception e => SomeException e
Meowbe/BSD-2-Clause
не требует, если инстанс можно выявить однозначно
Не должно ли тут отключение ограничения на мономорфизм помочь?
Alexander
это враппер, в котором словарики для Show,Exception
Андрей
рили придётся свою обёртку для этого городить?
Alexander
и там может лежать любое исключение
Alexander
это уже есть в либе
Alexander
т.е. если ты делаешь throw (YourException)
Alexander
то оно оборачивается в SomeException внутри
Alexander
когда ты делаешь catch/try
Alexander
то оно делает fromException :: SomeException -> Maybe e, где e определяешь ты
Alexander
если там Just то обработчик срабатывает, если нет, то исключение бросается выше
Alexander
т.е. хоть там 100500 либ используют расширяемые исключения, то ловлей SomeException ты словишь вообще все
Alexander
т.е. код вида catch f (\e -> show (e::SomeException))
Alexander
ловит вообще все исключения
Alexander
вообще в Control.Exception очень хорошая документация на эту тему, где все раскрывается
Alexander
и ссылки на статьи
Alexander
статьи тоже хорошие и понятные
Alexander
@azzaazaa примерно понятно?
Андрей
да
Alexander
вообще функция с такой сигнатурой как f очень неудачная, она немного ломает фреймворк
Alexander
минус таких исключений, на уровне типов они не как не следятся
Alexander
т.е. если в хаддоках не написали, то ты не узнаешь что тебе ловить
Андрей
следятся?
Alexander
ну вот есть f :: IO A что оно там бросает неизвестно
Alexander
т.е. если ты сделаешь catch (f >> g) smth
Alexander
то что тебе в smth ловить ты не знаешь
Андрей
ну я, когда я это писал, предпологал что должно быть неважно, что она бросит
Alexander
ну через SomeException не важно
Alexander
(почти)
Андрей
главное чтобы ошибку можно было превратить в строку для отладки
Alexander
show
Alexander
любое исключение имеет словарик Show
Alexander
ну +- все что я написал выше
Alexander
т.е. что у `f`наверняка неверная сигнатура
Alexander
а почему он простил уточнить тип - т.к. тип определяет пользователь, а не f, а из твоего года тип не выводился
Alexander
т.е. f x >>= either show pure неизвестно что за тип ожидает эта функция
Alexander
f x >>= either show @SomeException pure определяет
Alexander
почему я просил гист, т.к. тогда можно понять, что имелось ввижу в f на самом деле
Андрей
когда-нибудь покажу 😃
Alexander
из кода обычно делаешь что-то вроде: inner `catches` [ Handler $ \A -> .... , Handler $ \B -> ... , Handler $ \(x::SomeException) -> unknown-yet-exception-here ]
Alexander
@azzaazaa вообще скорее всего хочется так: f :: IO (EIther SomeException x)
Андрей
ок)