@haskellru

Страница 724 из 1551
Combot
01.01.2018
18:31:45
combot.org/chat/-1001043143583

A64m
01.01.2018
19:45:36
надо сказать, что между 8.2 и 8.4 получающаяся после оптимизации корка ощутимо поменялась.

в первую очередь в глаза две вещи бросаются

Alexander
01.01.2018
19:49:24
?

Google
A64m
01.01.2018
19:50:15
во первых, нет вот этих вот обычных заворачиваний анборкснутых результатов всяких сравнений в Bool let { lvl = tagToEnum# (==# x y) } in ... case lvl of { False -> ... True -> ... } вместо них case ==# x y of { __DEFAULT -> ... 1# -> ... }

во-вторых вот из вот этого вот обычного результата пропихивания вниз по кейсам, листья вот этого вот дерева, выносятся в join объявления вот в начале такой характерной развесистой функции так и идут join exit1 ... join exit2 и т.д.

первое выглядит явно лучше, а второе вроде не особо плохо, jump вроде дешевый, правда кода больше, чем если бы эти выходы инлайнились, за счет всей вот этой обвески объявлений всякими сигнатурами и аннотациями

но как-то все это у меня умудряется быть тормознее чем раньше (но не сильно, напр. процентов на 10)

можно представить случаи, с которые это вынесение даже лучше, если выходы очень уж много раз используются, что вообще типичный результат этого вот пропихивания вниз по кейсам

A
02.01.2018
09:24:55
всех с новым годом!

вот такая вот штука рисуется после stack build Ambiguous type variable ‘e0’ arising from a use of ‘f’ prevents the constraint ‘(GHC.Exception.Exception e0)’ from being solved.

вопрос, неужели нет какого-то "универсального" способа превратить ошибку в строку?

падает на коде вроде этого f:: (Exception e) => String -> IO (Either e L8.ByteString) anotherF = case f 'blabla' of Left x -> return $ show e Right y -> return $ bsToS y

то есть меня компилятор просит явно указать тип возможных ошибок

Vasily
02.01.2018
09:34:27
Left x ->return $ show x

A
02.01.2018
09:41:50
ну вот как я понял show и требует явной анотации типа

Aleksey
02.01.2018
09:43:58
не требует, если инстанс можно выявить однозначно

Google
Vasily
02.01.2018
09:45:56
У тебя там е вместо х откуда-то взялось

A
02.01.2018
09:52:54
да блин, это псевдокод

в общем оказалось, что не в show дело

или я опять что-то не понял

компилятор много где спотыкается, это было только первое сообщение

есть f :: (Exception e) => String -> IO (Either e L8.ByteString) я пишу что-то вроде anotherfunc = do result <- f "something" case result of Right ok -> ok Left ex -> show ex и компилятор ругается на result <- f "something" той ошибкой, которую я показывал выше

даже если я Left _ -> 'рыба' пишу, то есть игнорирую, то компилятор зачем-то хочет знать точный тип ошибки

Alexander
02.01.2018
10:07:45
e::SomeException -> print e

Left e -> show (e:: SomeException)

могу объяснить как работает, можно про статью про расширяемые исключения почитать

A
02.01.2018
10:09:42
ну вот, я не хочу каждый case описывать, вопрос и заключался в том : "можно ли не описывать все возможные варианты"

ghc сейчас их вываливает 12

Nick
02.01.2018
10:11:06
Alexander
02.01.2018
10:11:08
я тебе написал как не описывать все варианты

выше

полный код

A
02.01.2018
10:11:19
Nick
02.01.2018
10:11:33
в плане?
Ну ты то в скале, то ещё где-то )

A
02.01.2018
10:12:04
я везде кроме руби)

Google
A
02.01.2018
10:12:29
вообще пару месяцев, а что?

@gurinderu отвечай, собака

Nick
02.01.2018
10:13:52
Прост

Все, я не отвечаю 4 часа)

Alexander
02.01.2018
10:14:22
A Z вообще проще полный код на гист, чтобы ответ воспринимался и можно было просто запустить

а так show.SomeException это универсальный способ превратить в строку любое исклбчение

если у тебя уже используются расширяемые исключения, то просто show

но судя по тому, что у тебя Either e x результат, то у тебя уже есть какие-то обертки вокруг

угадать без гиста которые тяжело

A
02.01.2018
10:29:34
угадать без гиста которые тяжело
указание одного типа ошибок помогло

я почему-то думал, что ghc настолько строг, что проверит все возможные варианты

или потребует их всех

Alexander
02.01.2018
10:30:14
что значит все возможные варианты?

смотри, что значит f :: Exception e => IO (Either e A)?

A
02.01.2018
10:31:14
ну вот я добавил ghc-options: -fprint-potential-instances и получал 12 потенциальных типиов, половина из них конечно стандартные, остальная часть вроде как по смыслу подходит

то есть http ошибки

Alexander
02.01.2018
10:31:44
это значит что есть функция f которая может вернуть значение e _которое потребует юзер_

не, какое решит f, а какое попросит юзер

т.е. тот кто пускает функцию выбирает e

т.е. эта сигнатура, врятли верная в принципе

Google
Alexander
02.01.2018
10:32:45
как это может работать

A
02.01.2018
10:32:55
мне нужно сделать более конекретные тип ошибки я правильно тебя понял?

Alexander
02.01.2018
10:33:17
не знаю :) я не знаю твоей задачи, сейчас напишу возможности, ты сам выберешь

т.е. если у тебя f определяет исключение можно сделать свой sum type для ошибок

если выбор пользователем это нормально (там внутри try)

то делаешь новую сумму исключение data MyException

и пишешь ему руками instance Exception, где описываешь fromException, который из SomeException ловит интересные тебе

тогда заработает f >>= \case { Right x -> pure x; Left e@MyException{} -> show e}

как работает SomeExeption

Admin
ERROR: S client not available

A
02.01.2018
10:35:40
у меня внутри f могут происходить ошибки с двух разных библиотек, которые вообще никак не связанны, и те и другие используют Control.Exception я наивно подумал, что Control.Exception это общий интерфейс для всего, что только могут написать

Alexander
02.01.2018
10:35:49
data SomeException = forall e . Exception e => SomeException e

GNU/Maybe
02.01.2018
10:35:57
не требует, если инстанс можно выявить однозначно
Не должно ли тут отключение ограничения на мономорфизм помочь?

Alexander
02.01.2018
10:36:08
это враппер, в котором словарики для Show,Exception

A
02.01.2018
10:36:12
рили придётся свою обёртку для этого городить?

Alexander
02.01.2018
10:36:14
и там может лежать любое исключение

это уже есть в либе

т.е. если ты делаешь throw (YourException)

то оно оборачивается в SomeException внутри

когда ты делаешь catch/try

Google
Alexander
02.01.2018
10:37:07
то оно делает fromException :: SomeException -> Maybe e, где e определяешь ты

если там Just то обработчик срабатывает, если нет, то исключение бросается выше

т.е. хоть там 100500 либ используют расширяемые исключения, то ловлей SomeException ты словишь вообще все

т.е. код вида catch f (\e -> show (e::SomeException))

ловит вообще все исключения

вообще в Control.Exception очень хорошая документация на эту тему, где все раскрывается

и ссылки на статьи

статьи тоже хорошие и понятные

@azzaazaa примерно понятно?

A
02.01.2018
10:41:47
да

Alexander
02.01.2018
10:41:57
вообще функция с такой сигнатурой как f очень неудачная, она немного ломает фреймворк

минус таких исключений, на уровне типов они не как не следятся

т.е. если в хаддоках не написали, то ты не узнаешь что тебе ловить

A
02.01.2018
10:42:32
следятся?

Alexander
02.01.2018
10:42:50
ну вот есть f :: IO A что оно там бросает неизвестно

т.е. если ты сделаешь catch (f >> g) smth

то что тебе в smth ловить ты не знаешь

A
02.01.2018
10:43:29
ну я, когда я это писал, предпологал что должно быть неважно, что она бросит

Alexander
02.01.2018
10:43:40
ну через SomeException не важно

(почти)

A
02.01.2018
10:43:50
главное чтобы ошибку можно было превратить в строку для отладки

Alexander
02.01.2018
10:44:52
show

Страница 724 из 1551