
Aleksey
10.10.2018
07:52:41
Так и есть. Экспортирует Prelude
Не надо так

Alexander
10.10.2018
07:57:54
кажется с @chshersh был недавно разговор по этому поводу

Aleksey
10.10.2018
08:00:41
Вообще это интересный вопрос - как поиметь в проекте свою Prelude (+ base без оригинальной) и не сломать ничего тем, кто потом отдепендится от пакета проекта и от оригинальной base (c искоробочной прелюдией)

Google

kana
10.10.2018
08:02:06
https://github.com/kowainik/relude#base-noprelude
вот тут он поясняет подход про свой Prelude

Alexander
10.10.2018
08:02:44
ломать userspace плохо
и ghci глобальный
> head, tail, last, init work with NonEmpty a instead of [a].
вот понаделают своих prelude с ерундой вместо фич
и полезного: Functions sum and product are strict now, which makes them more efficient.

Dmitry
10.10.2018
08:06:54
кажется с @chshersh был недавно разговор по этому поводу
Да, мне HVR лично потом написал, что Prelude плохо экспортировать, и я потом на грабли от этого тоже наткнулся. В Summoner просто еще это не пофиксили, потому что как либо не подразумевается использовать, а поставить как исполняемый файл раньше проблем не было)

Alexander
10.10.2018
08:07:15
cabal-install ставит либу если она есть
вроде же нельзя executable only
можно конечно сделать песочницу, собрать и добавить симлинк на executable

alexknvl
10.10.2018
08:07:51

Dmitry
10.10.2018
08:08:21
Вообще это интересный вопрос - как поиметь в проекте свою Prelude (+ base без оригинальной) и не сломать ничего тем, кто потом отдепендится от пакета проекта и от оригинальной base (c искоробочной прелюдией)
Сейчас, кстати, есть два способа целых. Один через base-noprelude, который мы рекомендуем (особенно хорошо для больших проектов), а второй — через миксины, но, думаю, со стеком работать не будет. Я не проверял, но есть у меня подозрение, что stack не поддерживает миксины.

Google

Dmitry
10.10.2018
08:08:56

Alexander
10.10.2018
08:09:33

alexknvl
10.10.2018
08:09:47
я фаззил большой проект на много тысяч строк, head и т.д. падают достаточно часто, правда это скала

Dmitry
10.10.2018
08:10:48
cabal-install ставит либу если она есть
Я использовал cabal new-install и проблем не было. Когда делаешь cabal new-repl, то он каждый раз использует свое изолированное окружение, поэтому глобально установленная библиотека summoner не мешается.

Alexander
10.10.2018
08:11:20
интересно, ну у меня был старый cabal в том окружении, где я смотрел

Ilya
10.10.2018
08:11:57

Dmitry
10.10.2018
08:12:24
overrated во всяком случае
Я немного писал про мотивацию этого решения в комментарии на Reddit по мотивам блог поста.
https://www.reddit.com/r/haskell/comments/9kuy7d/keep_your_types_small_and_your_bugs_smaller/e72vwiq

alexknvl
10.10.2018
08:12:42
каждый head - это потенциальная ошибка. скажем в 1% случаев ты не сумеешь точно определить, что список (всегда) не пустой. в достаточно большом проекте это будет куча багов

Dmitry
10.10.2018
08:13:47
Да, возможно, дело в этом. Я использовал cabal-install
Я хочу слегка внести ясность в терминологию. Билд тула называется cabal-install (иногда люди сокращают до более короткого но более неоднозначного cabal`). Но у этой тулы есть две команды: `cabal install и cabal new-install

Ilya
10.10.2018
08:14:32

Alexander
10.10.2018
08:15:50

alexknvl
10.10.2018
08:16:07
так же и про null говорят

Alexander
10.10.2018
08:16:09
я не помню 1 или 2 ошибки в большом проекте из-за head/tail
не скала правда
а haskell
~50kloc
при этом если у тебя бродит список, то конвертация его в NonEmpty ничего по сравнению с head не даст

Dmitry
10.10.2018
08:18:21
я не помню 1 или 2 ошибки в большом проекте из-за head/tail
У меня был случай из реальной жизни с проблемой с head. Это еще было до колл-стеков. Во время преподавания я написал тулу, которая генерирует рандомизированные красивые варианты в LaTeX для контрольных и теорминов по своему курсу. И когда первый раз запустил, то увидел:
Prelude.head: empty list
Я потом два часа искал ошибку...

alexknvl
10.10.2018
08:18:36
даёт, т.к. ты это делаешь рано, где можешь ошибки разумно обработать

Alexander
10.10.2018
08:18:44
нет

Google

Alexander
10.10.2018
08:18:59
или ты делаешь это и так и так и используешь NonEmpty в структуре
и тогда наличие медленного и дурацкого head не помогает
давайте так
любой кто хочет доказывать мне, что head в Prelude плохой

kana
10.10.2018
08:20:00
по своему скромному опыту скажу, что head используется очень редко, а когда используется, то список обычно инвариантно не пустой (что на типах не выражено)

Alexander
10.10.2018
08:20:08
напишет эссе на 3-4 абзаца по поводу того, почему он такой
и почему он так сделан был
(hint: потому, что NonEmpty не было - не ответ)

alexknvl
10.10.2018
08:23:34
76клок, 6 багов с head в Scala 3 компиляторе, 8 c null, 8 с partial match, 2 с индексацией, 10 с кастами (считай partial match), и дохрена с `assert`ами. все эти баги - следствие недостаточного использования системы типов

Aleksey
10.10.2018
08:24:03

alexknvl
10.10.2018
08:24:07
и порядок у них один и тот-же, ~1 баг на 7клок

Alexander
10.10.2018
08:24:26
нормальное решение с head это было бы liquid types
вообще всегда используйте структуры, которые кодируют инварианты если это возможно
будет меньше проблем

Oleg
10.10.2018
08:25:02
Норм?

Alexander
10.10.2018
08:25:13
в NonEmpty их тоже нет
но вообще если бы были, то наверное проблема бы решилась

Oleg
10.10.2018
08:25:43
Но я специально не упоминал его, чтобы соответствовать требованиям рецензента

Google

Alexander
10.10.2018
08:26:08
=)

kana
10.10.2018
08:26:09
не ну nonempty это вполне себе некое веяние завтипа, "синглтон свойства непустоты"

Alexander
10.10.2018
08:26:44
ну это структура, которая описывает инвариант, который там должен быть

Oleg
10.10.2018
08:27:31
веяние завтипа
Как сформулировать задачу, чтобы Гранин не сказал "фримонада" ?

Alexander
10.10.2018
08:33:49
это вопрос про то, эквивалентом инструмента какой мощности является freemonad?
я думаю через них можно много почти все выразить

kana
10.10.2018
08:35:42
даже indexed free monad

Oleg
10.10.2018
08:36:19

alexknvl
10.10.2018
08:36:55
тогда уж graded и с free monoidом, чтобы совсем free было

Oleg
10.10.2018
08:37:16
Про ту, где два индекса или один?

kana
10.10.2018
08:38:45
да ничего особенного,
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
10.10.2018
08:39:26
Мне кажется у Pure должны совпадать
А у джойн котнрсимметрично связываться
Ага
Но это всё-таки indexed free, а не индексированная монада через free

Александр
10.10.2018
09:05:07
Вот накидайте, плиз, кода из production, где FT используется с показательным качеством

Alexander
10.10.2018
09:09:53
FT?

Google

Alexander
10.10.2018
09:09:59
Final tagless?

Александр
10.10.2018
09:10:06
Да

Alexander
10.10.2018
09:10:26
будет выглядеть как:
foobar :: MonadQ m, MonadBar m) => bla-bla -> m ()
в контексте все capabilities

Александр
10.10.2018
09:11:21
Ну, это я знаю, да. Мне бы хотелось именно на код посмотреть. Вопрос не в синтаксисе все же, а в дизайне интерфейса eDSL (вот этих вот параметров bla-bla, которые передаются обычно в функции, и что возвращается в итоге)

Alexander
10.10.2018
09:12:22
@chshersh, тут @VividDesires спрашивает про servant-generic, можешь про опыт рассказать

Leonid
10.10.2018
09:16:07
head используется только совместно с group

Alexander
10.10.2018
09:16:44
head используется там, где ок, а ещё к функции его использующей добавляют HasCallStack
на head который ругается если в контексте нету HasCallStack я бы может и согласился
@VividDesires @chshersh от меня вопрос кстати, а как в servant-generic с nested endpoints?

Anton
10.10.2018
09:18:11

Александр
10.10.2018
09:18:18
Я за то, чтобы head был unsafe.
Я намучался с сейфным head в PureScript. Нифига не удобно

Alexander
10.10.2018
09:18:35
через пачку типов вложенных?

A64m
10.10.2018
09:18:56
делать колстековый констрейнт для СТРАШНЫХ ЧАСТИЧНЫХ ФУНКЦИЙ было бы еще разумным для альтернативных прелюдий, да

Александр
10.10.2018
09:19:00

Alexander
10.10.2018
09:19:12

Anton
10.10.2018
09:19:21

Alexander
10.10.2018
09:19:39

Anton
10.10.2018
09:19:40
в поле просто структура подапи лежит

Alexander
10.10.2018
09:19:52
т.е. у меня есть тип, какой-нить типа Description "Blabla"

Anton
10.10.2018
09:19:55
сваггер вроде работает, но надо проверить

Alexander
10.10.2018
09:20:15
ну не важно, например я свой тип ввожу, о котором автор точно не в курсе