Alexander
ломать userspace плохо
Alexander
и ghci глобальный
Alexander
> head, tail, last, init work with NonEmpty a instead of [a].
Alexander
вот понаделают своих prelude с ерундой вместо фич
Alexander
и полезного: Functions sum and product are strict now, which makes them more efficient.
Dmitrii
кажется с @chshersh был недавно разговор по этому поводу
Да, мне HVR лично потом написал, что Prelude плохо экспортировать, и я потом на грабли от этого тоже наткнулся. В Summoner просто еще это не пофиксили, потому что как либо не подразумевается использовать, а поставить как исполняемый файл раньше проблем не было)
Alexander
cabal-install ставит либу если она есть
Alexander
вроде же нельзя executable only
Alexander
можно конечно сделать песочницу, собрать и добавить симлинк на executable
Big Bux Chungus
Dmitrii
Вообще это интересный вопрос - как поиметь в проекте свою Prelude (+ base без оригинальной) и не сломать ничего тем, кто потом отдепендится от пакета проекта и от оригинальной base (c искоробочной прелюдией)
Сейчас, кстати, есть два способа целых. Один через base-noprelude, который мы рекомендуем (особенно хорошо для больших проектов), а второй — через миксины, но, думаю, со стеком работать не будет. Я не проверял, но есть у меня подозрение, что stack не поддерживает миксины.
Big Bux Chungus
я фаззил большой проект на много тысяч строк, head и т.д. падают достаточно часто, правда это скала
Dmitrii
cabal-install ставит либу если она есть
Я использовал cabal new-install и проблем не было. Когда делаешь cabal new-repl, то он каждый раз использует свое изолированное окружение, поэтому глобально установленная библиотека summoner не мешается.
Alexander
интересно, ну у меня был старый cabal в том окружении, где я смотрел
Ilya
Dmitrii
overrated во всяком случае
Я немного писал про мотивацию этого решения в комментарии на Reddit по мотивам блог поста.
https://www.reddit.com/r/haskell/comments/9kuy7d/keep_your_types_small_and_your_bugs_smaller/e72vwiq
Big Bux Chungus
каждый head - это потенциальная ошибка. скажем в 1% случаев ты не сумеешь точно определить, что список (всегда) не пустой. в достаточно большом проекте это будет куча багов
Dmitrii
Да, возможно, дело в этом. Я использовал cabal-install
Я хочу слегка внести ясность в терминологию. Билд тула называется cabal-install (иногда люди сокращают до более короткого но более неоднозначного cabal`). Но у этой тулы есть две команды: `cabal install и cabal new-install
Ilya
Alexander
Big Bux Chungus
так же и про null говорят
Alexander
я не помню 1 или 2 ошибки в большом проекте из-за head/tail
Alexander
не скала правда
Alexander
а haskell
Alexander
~50kloc
Alexander
при этом если у тебя бродит список, то конвертация его в NonEmpty ничего по сравнению с head не даст
Dmitrii
я не помню 1 или 2 ошибки в большом проекте из-за head/tail
У меня был случай из реальной жизни с проблемой с head. Это еще было до колл-стеков. Во время преподавания я написал тулу, которая генерирует рандомизированные красивые варианты в LaTeX для контрольных и теорминов по своему курсу. И когда первый раз запустил, то увидел:
Prelude.head: empty list
Я потом два часа искал ошибку...
Big Bux Chungus
даёт, т.к. ты это делаешь рано, где можешь ошибки разумно обработать
Alexander
нет
Alexander
или ты делаешь это и так и так и используешь NonEmpty в структуре
Alexander
и тогда наличие медленного и дурацкого head не помогает
Alexander
давайте так
Alexander
любой кто хочет доказывать мне, что head в Prelude плохой
кана
по своему скромному опыту скажу, что head используется очень редко, а когда используется, то список обычно инвариантно не пустой (что на типах не выражено)
Alexander
напишет эссе на 3-4 абзаца по поводу того, почему он такой
Alexander
и почему он так сделан был
Alexander
(hint: потому, что NonEmpty не было - не ответ)
Alexander
Big Bux Chungus
76клок, 6 багов с head в Scala 3 компиляторе, 8 c null, 8 с partial match, 2 с индексацией, 10 с кастами (считай partial match), и дохрена с `assert`ами. все эти баги - следствие недостаточного использования системы типов
Aleksei (astynax)
Big Bux Chungus
и порядок у них один и тот-же, ~1 баг на 7клок
Alexander
нормальное решение с head это было бы liquid types
Alexander
вообще всегда используйте структуры, которые кодируют инварианты если это возможно
Alexander
будет меньше проблем
Oleg
Oleg
Норм?
Alexander
в NonEmpty их тоже нет
Alexander
но вообще если бы были, то наверное проблема бы решилась
Oleg
Но я специально не упоминал его, чтобы соответствовать требованиям рецензента
Alexander
=)
кана
не ну nonempty это вполне себе некое веяние завтипа, "синглтон свойства непустоты"
Alexander
ну это структура, которая описывает инвариант, который там должен быть
Oleg
веяние завтипа
Oleg
Как сформулировать задачу, чтобы Гранин не сказал "фримонада" ?
Alexander
это вопрос про то, эквивалентом инструмента какой мощности является freemonad?
Alexander
я думаю через них можно много почти все выразить
кана
даже indexed free monad
Big Bux Chungus
тогда уж graded и с free monoidом, чтобы совсем free было
Oleg
Про ту, где два индекса или один?
кана
да ничего особенного,
IFree f i j a =
Pure :: a -> IFree i i a
Join :: f i j (IFree j k a) -> IFree i k a
run :: (forall ... f i j a -> m i j a)
-> (IFree f i j a -> m i j a)
Oleg
Oleg
Мне кажется у Pure должны совпадать
Oleg
А у джойн котнрсимметрично связываться
Oleg
Ага
Oleg
Но это всё-таки indexed free, а не индексированная монада через free
Alexander
Вот накидайте, плиз, кода из production, где FT используется с показательным качеством
Alexander
FT?
Alexander
Final tagless?
Alexander
Да
Alexander
будет выглядеть как:
foobar :: MonadQ m, MonadBar m) => bla-bla -> m ()
Alexander
в контексте все capabilities
Alexander
Ну, это я знаю, да. Мне бы хотелось именно на код посмотреть. Вопрос не в синтаксисе все же, а в дизайне интерфейса eDSL (вот этих вот параметров bla-bla, которые передаются обычно в функции, и что возвращается в итоге)
Alexander
@chshersh, тут @VividDesires спрашивает про servant-generic, можешь про опыт рассказать
Leonid 🦇
head используется только совместно с group
Alexander
head используется там, где ок, а ещё к функции его использующей добавляют HasCallStack
Alexander
на head который ругается если в контексте нету HasCallStack я бы может и согласился