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
что конечно хорошо, но немножко меньше
Alexander
они же не неиспользуемые
Artem
A64m
Leonid 🦇
Alexander
вот с непредсказуемыми я не знаю
Alexander
в общем-то они считаются
Alexander
@ulysses4ever все локальные переменные, которые используется в коде, но не вычисляются во всех ветках
Artem
Никто не спорит, что первоклассная ленивость удобней, чем костыли, но костыли практичней
A64m
Alexander
но я например не осилю посчитть
Leonid 🦇
Alexander
впрочем в строгом языке тоже не факт, что всегда осилю
Leonid 🦇
Ленивость не практична. хаскель не практичен.
A64m
Artem
Если вас (как меня например) не сильно волнует производительность, то, конечно, ленивость ок и очень удобна
Leonid 🦇
Что мы тут вообще делаем все? У нас терапевтическая встреча клуба людей с Стокгольским синдромом?. Какой-то Фрейдистский фалос в голове мешает нам писать на практичных ЯП?
Alexander
ой...
Alexander
ну зачем так-то
Alexander
: (
Aliester
нас раскрыли
Aliester
пшшш
Leonid 🦇
Aliester
*кидает дымовую шашку и и исчезаезт*
Алексей
Alexander
ну черт знает, я в haskell непредсказуемые тормоза и из-за ленивости и из-за строгости видел
A64m
Andrew
Пора выходить из чата?
Alexander
и в идрисе у меня была куча всего O(N^2) вместо O(N) т.к. он строгий
Alexander
а переписывать и сильно усложнять код, чтобы он был O(N) не хотелось
Alexander
но то, что имея тип структуры нельзя сказать сколько она занимает в ленивом языке - может быть проблемой
A64m
ФП в ленивом языке точно практичнее, чем в строгом
Правда практичность ФП довольно сомнительна пока
Anonymous
Есть уже, ! и force
Разве ! устрожает всю цепочку? Думал, только непосредственно вызываемую ф (первую в цепочке)..
Alexander
! вычисляет то, перед чем оно стоит до WHNF
Alexander
изначальный и единственный агрумент за строгость: програмисту кажется, что он лучше её понимает
Alexander
причем понимает, т.к. учился на строгих яп
A64m
ну, не только кажется, ведь он действительно учился на них
Alexander
хотя не, изначальный, т.к. это проще написать
Aliester
я вот сейчас одному школьнику помогаю
Aliester
он входит в программирование через хаскель
Aliester
и лисп
Aliester
скинул ему курсов и книжек, вроде учится
Alexander
а нормальных книжек не то, чтобы много
A64m
правда это не единственный и даже не главный аргумент
решает будет язык ленивый или строгий фактически его имплементатор, потому главный аргумент за строгость:
ее проще имплементировать
Alexander
единственное когда я увидел проблему с ленивостью, это когда пытались определить семантику и понять что с linear-types делать
Alexander
ленивость там 100500 радостей приносит, которые в строгом языке понятнее как решать
Dmitry
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
Alexander
обернуть тип нужно в Once конечно же
Alexander
создать Once можно вызвав метод once
Cheese
Cheese