A64m
заметил, что я почти никогда не использую Text.Lazy
так это для лэзи ио только. причем каким-то чудом тектовое лези ио тормозное
Alexander
ну генерировать строки в ленивые тоже норм
Alexander
т.е. Text.builder
NC
Или замкнутые сами на себе
Alexander
правда редко нужен
A64m
> Exceptions that actually get reflected in the type. видимо 2 + 2 :: Int '[SomeAsyncException, AllocationLimitExceeded, CompactionFailed] или что-то вроде
Alexander
при том, что сейчас SomeAsyncException не гарантирует что оно асинхронное
A64m
конечно, обязательно кто-то пишет про то что нетотальных функций не должно быть (в рассылочке библиотечного комитета кстати недавно была дискуссия об аннотациях таких функций в доках, там в результате не смогли договориться даже что под этими словами понимается, надо ли аннотировать length так же как head и т.д.)
Alexander
и не все асинхронные ловит, то добавь ещё SomeException
Alexander
а оно может?
Alexander
не вообще круто наверное было бы если бы функцию можно было аннотировать как-то: {-# ANNOTATION "Exception" [ArithException] <> (Exception a) <> (Exception b) foo :: a -> b -> c
Alexander
а лучше язык каких нить предикатов
Алексей
А, не + не может. Туплю
Alexander
типа: {-@ Exception when (a is []) EmptyList @-} head :: [a] -> a
Alexander
и модификаторы типа safe и unsafe
Alexander
хочешь заставить себя работать честно пиши safe head и подавай с scope доказательство
Alexander
не хочешь пиши unsafe head и не трать время
Alexander
или safe @ onPredicateFailure head чтобы определить что делать в случае падения предиката
Alexander
unchecked же для Int?
Alexander
Prelude> maxBound + (1::Int) -9223372036854775808
Kirill
не, ну чтоб safe был совсем
Kirill
надо бы checked
Alexander
другое дело, что если там не Int а свой тип
A64m
надо для всех функций которые кидают просто стек-контекст выводить. если функция короткая то она заинлайнится и от контекста тормозов не будет, если здоровенная, то тормоза не будут заметны, а если стектрейсы будут нормальные особо и жаловаться на нетотальные функции перестанут
A64m
хотя это измерять надо, конечно
Alexander
ну т.е. safe / unsafe модификатор был бы прикольный
Alexander
пишешь unsafe функцию + контрейнты
Alexander
ну или safe + констрейнты
Alexander
и переключалка
NC
Мне не особо нравится, когда hmatrix вылетает с error от head, даже если там стектрейс будет
Alexander
чтобы не делать либу типа safe
A64m
не хочешь пиши unsafe head и не трать время
с ликвид хаскелем можно получше, просто в прекондишены функции которая head использует поднять это условие а там уж пусть у пользователя этой функции голова болит
Alexander
да, ликвид хаскель хороший в этом отношении
A64m
пока чего-то такого нету из коробки с нетотальными функциями воевать рано, очень уж страшный код получится
Alexander
и тормозной не по делу
NC
Особенно радует, когда приходится форкать либу, чтобы в чистом коде не вылетало что-то подобное https://www.stackage.org/haddock/lts-12.9/base64-bytestring-1.0.0.1/src/Data.ByteString.Base64.Internal.html#encodeWith
NC
error "Data.ByteString.Base64.encode: input too long"
NC
и из чистого кода прилетает в хендлер сервака, итого 500
A64m
Я, кстати, зря решил что 2+2 выкинет эксепшон при попытке компактнуть, потому что функции не компактятся. он же просто вычислил перед этим - да и все. сейчас проверил
Dmitrii
Идеально, спасибо
Пожалуйста! Приятно, что людям интересны и полезны блог-посты, над которыми ты трудишься 😊 Кстати, как раз вчера-сегодня дошли руки смонтировать и выложить видео с выступлением по теме этого же блог поста: https://youtu.be/GLtp3Xy7Rps Качество не самое лучшее, потому что пришлось выкручиваться, как могли, но что поделать.
NC
Но это всё скорее из-за неудачных решений в либах, чем от отсутствия тотальности по-умолчанию
Alexander
пошли пул реквест!
Alexander
(хахаха)
NC
*нервный смех*
A64m
(автор пакета едет где-то на велосипеде и зловеще хохочет)
NC
(и дело происходит 19 Апреля)
Alexander
а почему в кассаве нету FromRecord a, FromRecord b => FromRecord (a,b)
Alexander
хотя бы через какой-нибудь wrapper
Alexander
хотя наверное ясно
A64m
> Have you felt guilty learning haskell? > I always end up feeling really guilty for spending so much time trying to learn the basics when I could be spending this time learning something like golang where I could perhaps build something.
A64m
а почему в кассаве нету FromRecord a, FromRecord b => FromRecord (a,b)
мне как-то пришлось написать такой инстанс для оптпарс-дженерик (не для тупла, для самообъявленной пары, правда)
Alexander
ктста
Alexander
а никто не знает есть ли уже готовый тип и инстанс для Aeson для гетерогенного списка с префиксами
Alexander
типа Y [("foo", A), ("bar", B)]
Alexander
который бы парсил {"foo": A, "bar": B}
Alexander
а то я накостылял, это конечно строк 20 но все же
Andrey
deriving newtype работает как надо
NC
типа Y [("foo", A), ("bar", B)]
Есть моя либа, которая умеет так aeson-injector
Alexander
deriving newtype?
NC
WithField "foo" A (OnlyField "bar" B)
Alexander
нормально
Alexander
теперь надо решить хочу ли я свои 20 строк менять на либу
Alexander
но главное уже есть на hackage
NC
со stackage выпилили, пока я был в отпуске
Andrey
deriving (...) deriving newtype (FromJSON, ToJSON)
NC
надо снова им PR открыть
Alexander
deriving (...) deriving newtype (FromJSON, ToJSON)
я не понял как это мне поможет...
Alexander
вот есть у меня типы A , B лежащие в разных местах
Alexander
я не хочу писать A_PLUS_B = A { a:: A, b::B}
Alexander
в идеале я хочу написать: x <- Yaml.decodeFile ... case x of Rigth ( "a" .= a & "b" .= b) -> ...
Alexander
и чтобы у меня все вывелось
Alexander
не в идеале я готов написать Right ( "a" .= a .&. "b" .= b .&. Z)
Alexander
ещё в меньшем идеале я готов написать type annotation для Yaml.decodeFile @ [...] ...
Alexander
я сейчас нахожусь тут
Andrey
тада не получится если бы у тебя обёртка была над каким-нибудь Object, то тогда помогло бы
Alexander
с aeson-injector я похоже буду находиться там же