Alexander
Почему?
Влод
вот например ещё один вариант, назовём его "синтаксическая эквивалентность"
undefined и void по буквам не совпадает, так что они не эквивалентны
Alexander
А let loop = loop in loop?
Влод
Ilya
Хорошо, допустим. Для закрепления:
Если мы определим
data Void = Void Void
void = Void void
То void НЕ будет bottom, верно? Потому что находится в СЗНФ? А для
newtype Void = Void Void
void невозможно привести к СЗНФ, поэтому это bottom
Ilya
Так?
Ilya
Сорри, с телефона пишу, опечатки
Нурлан
Декомпозиция в Haskell определяет бесконечные циклы
Нурлан
Ты можешь с ними работать не можешь вычислить
Нурлан
Скажите мне в чем проблема? Я не понимаю
Влод
Нурлан
Выражение void = Void void верное
Ilya
Ilya
Ща я разберусь, а потом тебе объясню
Нурлан
Это как определение бесконечности для целых чисел
Ilya
data же ленивый
Alexander
data Void = Void Void не bottom
Ilya
Влод
потому что невычислимое выражение? разве что можно прикопаться к тому что боттом = невычислимое для каждого типа, а здесь для данного конкретного
Ilya
Ilya
Видел же стримы?
Ilya
Там то же самое
Ilya
И это никакой не боттом
Влод
нет не видел
Ilya
От них можно брать take и т.д.
Влод
но и не видел определения боттома зависещего от ленивости
Нурлан
Если выражение не вычисляемое это не значит что его нельзя вычислять. Невычисляемый (bottom) это значит что неизвестно будет ли формула упрощена (вычеслена)
Ilya
Ну как список, только без конструктора пустого списка
Влод
ну ок идею понимаю
Ilya
Мы же определяем поток как data Stream a = a :& Stream a
Нурлан
А вычислять и упрощать да сколько влезет
Влод
легко определить бесконечный список
Влод
и ты про то же самое
Ilya
Вот тебе специальная data
Нурлан
Нурлан
Поток можно пустить на декомпозицию
Нурлан
Вычислить нельзя
Ilya
Например напечатать первые 10 элементов или мапнуть
Нурлан
Печать первых 10 идёт через декомпозицию
Нурлан
Не через полное вычисление
Влод
тогда допустим
1) a = 1:a
2) length a
1е не боттом. 2е боттом?
Нурлан
По мне так да
Влод
по мне так одно и то же
Нурлан
А как проверить что что-то Боттом ?
Нурлан
В компиляторе такое есть?
Влод
нет
Влод
про компилятор забудь
Ilya
Влод
мы тут наверное про теорию
Ilya
Как ты их вообще сравниваешь
Ilya
Я не понял
Ilya
bottom это ЗНАЧЕНИЕ
Влод
а харошо
Влод
блин да это я смачно тут народ обманул
Ilya
Ты имеешь в виду, является ли a bottom?
Влод
a и length a
Ilya
a не bottom
Ilya
length a думаю, что да
Ilya
Но блин это на самом деле разговор трех нубов
Влод
всё таки боттом?
Ilya
Да
Влод
ну да, стоит как бы забыть про то что мы все некомпетентны
Влод
это только мешает
Влод
если бы здесь заявился бы авторитет то каждый бы просто сказал – ага ок я понял
Влод
и всё, а так рассуждение
Ilya
я вот попробую резюмировать
Ilya
1. Для любого выражения в Haskell можно сказать, что либо его верхний конструктор вычисляется за конечное время (приведение к СЗНФ, слабой заголовочной нормальной форме), либо нет. Нам не важно, что эта задача в общем случае алгоритмически неразрешима (всем известная "проблема останова"). Главное, что это так.
2. Если верен второй случай (верхний конструктор невычислим), то мы называем такое значение bottom
3. Тем не менее, даже для значений bottom можно вывести их тип. Например length (бесконечный список) — bottom типа Int
4. Мы говорим, что все bottom одного и того же типа эквивалентны и суть одно и то же значение этого типа.
5. Дополнительно мы определяем полимофный undefined, который являет собой bottom любого типа. bottom любого конкретно типа и undefined - одно и то же.
Ilya
@qnikst это не бред?
Alexander
Попозже прочитаю отвечу
Влод
>Мы говорим, что все bottom одного и того же типа эквивалентны
плюс бесконечность и минус бесконечность
Alexander
Я тут сына домой веду неудобно читать
Ilya
Влод
ну или рекурсия по разным конструкторам, хотя в итоге конечно не важно какое будет значение
Ilya
Ilya
А если энергичные, то одинаковые, bottom
Ilya
я так думаю
Ilya
А насчёт плюс бесконечности и минус бесконечности — ты какой тип имеешь в виду?