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 чтобы определить что делать в случае падения предиката
Kirill
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
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.
Alexander
ктста
Alexander
а никто не знает есть ли уже готовый тип и инстанс для Aeson для гетерогенного списка с префиксами
Alexander
типа Y [("foo", A), ("bar", B)]
Alexander
который бы парсил {"foo": A, "bar": B}
Alexander
а то я накостылял, это конечно строк 20 но все же
Andrey
deriving newtype работает как надо
NC
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
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 я похоже буду находиться там же