Нельзя определить seq как-то иначе*, чтобы для неё были справедливы эти равенства
Здесь всё упирается в лямбда исчисление и, возможно, другие математические теории. Вы здесь на своём поле, я же не математик. Поэтому можно или нельзя определить в математических терминах - не знаю. Но знаю точно, что можно определить алгоритмически. Причём абсолютно однозначно и очень коротко.
Из этого есть следствие - если для понимания двух строк алгоритма нужно изучить лямбда исчисления и ещё что-то, то на мой взгляд это как раз напрямую относится к вопросу, заданному автором темы. Он спросил про смысл изучения теории категорий в применении к хаскелю и программированию вообще, но часть "в применении к хаскелю", как мы видим, просто невозможна в полном виде без изучения ещё и лямбда исчисления (и возможно чего-то ещё).
Но вам спасибо, что хоть и несколько нетерпеливо, но наглядно показали и это важный момент, переводящий "игры с хаскелем" в ещё более затяжное занятие.
Я считаю, что не важно что используется (но GHC действительно передаёт такой токен длины, как пишут, 0). А с памятью от этого должно что-то особенное случаться?
То, что используется, определяется некой целью. Разговор начался с недостающего параметра RealWorld, который по мнению участников не даёт исполнять операции с эффектами. Я заметил, что если бы это было так, то программам очень часто не хватало бы памяти. Поэтому я считаю, что параметр RealWorld служит для каких-то других целей, которые нужно выяснять где-то в описании компиляторов хаскеля. Ну а передаётся он или нет, это действительно не важно в сравнении с темой о том, как этот параметр используется.
Я показал пример, где на мой взгляд проявлялась ленивость в отношении IO. Далее пошло обсуждение, можно ли это считать проявлением ленивости.
Да, и остаётся только повторить, что
seq форсит свой левый аргумент и потому говорить в том примере о ленивости как минимум самонадеянно.
Хорошо, заменим seq самописной функцией, возвращающей второй параметр и игнорирующей первый. Проявится ли здесь ленивость?
На seq я остановился почти случайно, просто вспомнив её в вашем же сообщении и использовав в роли функции, игнорирующей первый параметр. Хотя да, в глубины понимания лямбда исчисления при этом я совершенно не вдавался. Ну а отсутствие принуждения проверил экспериментально. Как минимум - эффект выглядит именно так (если не вдаваться в лямбда исчисления).
Ну вам уже целую страницу раскрывали, что вы неправильно понимаете про seq.
Хорошо, признаю, что в лямбда исчислениях не силён. Но алгоритмический смыл хотелось бы видеть. И что важно - этот смысл реально есть (реализован в компиляторе), но сокрыт за мраком лямбда исчисления.
В любом случае, пару вещей можно вывести и из того определения seq, что дано в Report, и они не согласуются с вашей гипотезой, всё.
Не заметил этой пары вещей. В сети пишут, что seq действительно принуждает, но как - совершенно не понятно. Остаётся лишь гадать на тему того, как конкретно выглядит объект IO или же функции, его возвращающие, от чего далее строить гипотезы о работе seq. Только все эти гадания могли бы быть сведены к нулю, будь у хаскеля нормальная документация.
Потом ещё про документацию снова начали — ну допустим даже она была бы вообще никакая, как это относится сюда?
Если она никакая, то не возникает понимания модели исполнения. А без такого понимания невозможно полноценно использовать инструмент. Ссылки же на лямбда исчисления и прочую математику совсем не добавляют понятности в использовании инструмента, а лишь заставляют тратить на его изучение всё больше и больше времени (по сути вместо хаскеля изучая почти всю математику). Разве это нормально? Ну и разве не стоит ответить автору темы именно с указанием на такие потенциальные сложности?
Ну так описано же, что она делает: она вычисляет; до того, пока не наткнётся на конструктор (здесь один из конструкторов IO) или недоприменённую функцию, после чего заканчивает (ибо WHNF).
А почему вы считаете, что IO отдаётся функцией putStr в неком разобранном состоянии? В смысле зачем применять конструктор к уже созданному объекту?
Мне кажется, что никакие недоприменённые функции и прочее здесь никак не участвуют, но просто не выполняется операция, которую putStr положило в объект IO. И недовыполняется она из-за специфической реализации работы с эффектами, создание которых рантайм планирует по своим законам. Законы нам неизвестны, но нам вполне известен ленивый механизм задержки исполнения, используемый в хаскеле, поэтому логично предположить, что именно лень в данном случае всё же играет важнейшую роль - она не даёт рантайму повода для запуска эффектов. То есть объект IO никто не дёргает, а ленивость, соответственно, предполагает отсутствие исполнения в таком случае.
Ваша же версия про конструктора и прочее совершенно не укладывается в имеющиеся у нас факты. А вот с ленивостью - всё становится понятным.
Эффекты выполнять она не будет, этим рантайм занимается на отдельных началах, а не в качестве вычислений, хоть бы и вычислений с участием seq.
Роль seq здесь - принуждение. Но как мы наблюдаем - принуждение не сработало, не смотря на то, что хоть оно и выполнилось (множество заявлений в интерентах тому подтверждение), но скорее всего само выполнение не предполагало создание эффекта именно до наступления события, когда этот эффект будет востребован в каком-то внешнем вызове, то есть до выполнения "ленивых" правил.
Обсуждение seq в этой теме оффтоп, обсуждение качества документации — оффтоп по отношению к этому оффтопу, и я по одной из предыдущих тем с вашим участием уже уяснил, что почкуются они как гидра.
Глубокое понимание вопроса требует, например, изучения всей математики, но мне не приходит в голову заявлять, что это оффтоп и потому я не буду ничего изучать.
Автор темы спросил - что даст изучение теории категорий и хаскеля для программиста? И весь наш разговор прямым текстом ему сообщает - изучение даст возможность надолго погрязнуть в глубинах математики с совершенно непонятным результатом на выходе. По мне так это очень важная для автора темы информация.
Не знаю как остальные, а мне трудно управляться с одним только этим разговором про seq без отступлений.
Ну вот и вы тоже понимаете, что показать что-то серьёзное не вникая в глубины - невозможно. Я рад такой внезапной поддержке с вашей стороны :)