A64m
Это связано с тем что Идрис сделали строгим
вот причина, которую называет сам автор > The original reason is not even anything to do with practical choice. It was just the way I wanted to do it at the time, having already implemented a lazy VM for an earlier project. https://www.reddit.com/r/haskell/comments/36s0ii/how_do_we_all_feel_about_laziness/crgwc6f/
Leonid 🦇
Покажите мне ЯП где я могу как в хаскеле понаписать любой ерунды в where и не боятся что вычеслю слишком много
Alexander
вот reasoning для всяких исключений, тотальности, линейных типов - он проще со строгостью
Alexander
но если вы выберите строгий по умолчанию язык, то о прямой ленивости можно забыть
Alexander
максимум что будет всякие итераторы стримы и т.п.
Alexander
что конечно хорошо, но немножко меньше
Artem
Покажите мне ЯП где я могу как в хаскеле понаписать любой ерунды в where и не боятся что вычеслю слишком много
Это прекрасно и удобно, никто не спорит. Проблема в цене, которая за это заплачена: непредсказуемые затраты по памяти… а неиспользуемые байндинги, кстати, многие компилятора прекрасно выбрасывают. Конечно, это implementation-dependent, что хуже
Alexander
они же не неиспользуемые
A64m
Herbert Valerio Riedel говорит, что следующий за 2.2 cabal будет 3.0 и там по умолчанию уже будет nix-style local build (https://github.com/haskell/cabal/issues/5074#issuecomment-360978451), ссылается при этом на проект для GSoC. Как считаете, это реально?
прямо скажем, это было реально уже годы назад, это просто было не кабалистский подход, отдать пользователю что-то недоделанное, а потом получать фидбек и допиливать
Leonid 🦇
Alexander
вот с непредсказуемыми я не знаю
Artem
вот я про это да
Тогда определите что такое ерунда в where :)
Alexander
в общем-то они считаются
Alexander
@ulysses4ever все локальные переменные, которые используется в коде, но не вычисляются во всех ветках
Artem
Никто не спорит, что первоклассная ленивость удобней, чем костыли, но костыли практичней
Leonid 🦇
Тогда определите что такое ерунда в where :)
case foo of ... -> ... -> ... -> ... where ... ... ...
Alexander
но я например не осилю посчитть
Anonymous
как в Элис что ли?
Про Элис слышу впервые 😔
Alexander
впрочем в строгом языке тоже не факт, что всегда осилю
A64m
Про Элис слышу впервые 😔
http://www.ps.uni-saarland.de/alice/manual/futures.html
Leonid 🦇
Ленивость не практична. хаскель не практичен.
Artem
все говорят что ленивость плохо, а мне норм.
Про плохо я не слышал, я слышал про практичней, потому что предсказуемее
Artem
Если вас (как меня например) не сильно волнует производительность, то, конечно, ленивость ок и очень удобна
Leonid 🦇
Что мы тут вообще делаем все? У нас терапевтическая встреча клуба людей с Стокгольским синдромом?. Какой-то Фрейдистский фалос в голове мешает нам писать на практичных ЯП?
Alexander
ой...
Alexander
ну зачем так-то
Alexander
: (
Aliester
нас раскрыли
Aliester
пшшш
Aliester
*кидает дымовую шашку и и исчезаезт*
Alexander
ну черт знает, я в haskell непредсказуемые тормоза и из-за ленивости и из-за строгости видел
Andrew
Пора выходить из чата?
Alexander
и в идрисе у меня была куча всего O(N^2) вместо O(N) т.к. он строгий
Alexander
а переписывать и сильно усложнять код, чтобы он был O(N) не хотелось
Alexander
но то, что имея тип структуры нельзя сказать сколько она занимает в ленивом языке - может быть проблемой
A64m
ФП в ленивом языке точно практичнее, чем в строгом Правда практичность ФП довольно сомнительна пока
Anonymous
Есть уже, ! и force
Разве ! устрожает всю цепочку? Думал, только непосредственно вызываемую ф (первую в цепочке)..
Alexander
! вычисляет то, перед чем оно стоит до WHNF
Artem
и в идрисе у меня была куча всего O(N^2) вместо O(N) т.к. он строгий
Да, это изначальный и единственный аргумент за ленивость: вычисления лучше структурированы. Но есть оборотная сторона, которая перешивает для многих. Мне казалось, Саймон часто говорил, что эта фича получилась довольно противоречивой. Но искать лень
Alexander
изначальный и единственный агрумент за строгость: програмисту кажется, что он лучше её понимает
Alexander
причем понимает, т.к. учился на строгих яп
A64m
ну, не только кажется, ведь он действительно учился на них
Alexander
хотя не, изначальный, т.к. это проще написать
Aliester
я вот сейчас одному школьнику помогаю
Aliester
он входит в программирование через хаскель
Aliester
и лисп
Aliester
скинул ему курсов и книжек, вроде учится
Alexander
а нормальных книжек не то, чтобы много
A64m
правда это не единственный и даже не главный аргумент решает будет язык ленивый или строгий фактически его имплементатор, потому главный аргумент за строгость: ее проще имплементировать
Alexander
единственное когда я увидел проблему с ленивостью, это когда пытались определить семантику и понять что с linear-types делать
Alexander
ленивость там 100500 радостей приносит, которые в строгом языке понятнее как решать
Alexander
force вычисляет агрумент до NF всегда проходя его
Alexander
evaluate . force все вычисление
Alexander
но с другой стороны force даже по вычисленному пробежится, поэтому хорошо бы его в newtype Once запихивать
Dmitry
"Его" -- вычисленное?
Alexander
результат
Dmitry
И как это приведёт к однократному пробегу?
Alexander
data Once a = Once () a если таскать такое вместо a то последующие форсы не будут пробегать структуру
Alexander
once :: NFData a => a -> Once a once a = Once (rnf a) a instance NFData (Once a) where rnf (Once () _) = ()
Dmitry
Прикольно! :)
Alexander
https://www.schoolofhaskell.com/user/edwardk/snippets/once
Cheese
почему только последующие? похоже, что на эту структуру вообще rnf не действует как ожидается
Dmitry
Не, там имеется ввиду, что надо где-то в коде дёрнуть once, а последующие force уже не будут на неё действовать
Cheese
но если не дёрнуть once, то force вообще никогда не будут действовать? в чём смысл слова "последующие" перед "force"?
Dmitry
Ну так, да.
Алексей
Это структура в которой WHNF=NF (но создачать её можно только once)
Cheese
а, надо обернуть данные в once (sic!), а не в Once!
Alexander
обернуть тип нужно в Once конечно же
Alexander
создать Once можно вызвав метод once
Cheese