Влод
ну ладно. one = 1 * one zero = 0 * zero
Влод
ну это наверное вопрос предпочтений: можно ли к этим значениям применять аналитику, и самостоятельно без компилятора доказывать, что они не равны. Если да, то боттомы равны в пределах одного конструктора
Ilya
кстати интересно, что ghc не в состоянии вычислить, что zero == 0
Ilya
т.е. там нет фишки типа 0 * _ = 0
Влод
да, я тоже пытался манипулировать этим
Ilya
как для Bool
Влод
потому что * не тайп конструктор)
Ilya
и что, && тоже не конструктор
Ilya
однако False && _ = False
Ilya
а вместо _ может быть чё угодно
Ilya
даже bottom
Нурлан
т.е. там нет фишки типа 0 * _ = 0
Не для всех числовых типов есть ноль
Нурлан
и что, && тоже не конструктор
Строится над конкретным типом
Ilya
λ> let false = False && false λ> false False λ>
Нурлан
В определении чисел в Haskell не сказано что у них должны существовать 1 и 0
Ilya
Не для всех числовых типов есть ноль
я заметил, что ты часто говоришь верные, но абсолютно не-в-тему увтерждения :D Извини
Влод
ну так то мне помнится слово thunk (не вычесленное выражение типа 0 * _) и мне казалось, что хаскель делает какие то подобные оптимизации в рантайме. ну мб только на уровне data типов
Нурлан
И не делают
Ilya
Почему нельзя для Integer такое сделать?
Ilya
в теории
Нурлан
Но * пришла не из integer
Влод
это речь про Num (или как там определен *)
Нурлан
Она определяется в классе чисел
Нурлан
А в классе чисел не для всех чисел есть 0 и 1
Ilya
да я думаю там всё проще
Ilya
умножение передаётся напрямую процессору
Ilya
без всякого паттерн-матчинга
Влод
слушай, а ведь и правда то что False && _ = False определено прямо в инстансе Bool
Нурлан
Умножение через инстанс определяется, но для стандартных типов да
Влод
а инстансы Integer для Num наверное и не нарыть
Влод
они тип платформо-зависмые
Ilya
А в классе чисел не для всех чисел есть 0 и 1
я конечно не знаю, как там в кишках устроен Num
Ilya
но в Num есть функция fromInteger
Ilya
и не просто так она там
Ilya
то есть подразумевается, что соответствие между Integer и Num есть
Ilya
и вполне прямое кстати
Нурлан
но в Num есть функция fromInteger
Она тоже через инстанс определяется
Ilya
хорошо
Ilya
давай так
Ilya
λ> :t 0 0 :: Num a => a
Ilya
прокомментируй это
Ilya
хотя ладно, давай проще ещё
Влод
instance Num Int where I# x + I# y = I# (x +# y) I# x - I# y = I# (x -# y) negate (I# x) = I# (negateInt# x) I# x * I# y = I# (x *# y) abs n = if n `geInt` 0 then n else negate n signum n | n `ltInt` 0 = negate 1 | n `eqInt` 0 = 0 | otherwise = 1 {-# INLINE fromInteger #-} -- Just to be sure! fromInteger i = I# (integerToInt i)
Влод
поискал таки
Ilya
Integer - это инстанс Num, так? Умножение определяется в инстансе, так? Вот почему мы в ИНСТАНСЕ для Interger не можем определить умножение как нам хочется? В т.ч. и 0 * _ = 0
Нурлан
λ> :t 0 0 :: Num a => a
В компиляторе используется контекст. Вот и весь комментарий
Ilya
как и должно
Ilya
потому что нехрен паттерн-матчить
Ilya
но если бы захотели, то могли бы
Нурлан
Integer - это инстанс Num, так? Умножение определяется в инстансе, так? Вот почему мы в ИНСТАНСЕ для Interger не можем определить умножение как нам хочется? В т.ч. и 0 * _ = 0
🤔 может потому что дешевле вычислить чем поверить что ноль. Когда пишем 0*_=0 нужно проводить if условие. Даже если не дешевле такой код уже было бы сложно параллелить на видюхе из-за скрытого if. Я причин не знаю, но приведённых мной мне достаточно.
Ilya
всё правильно:) и я о том же
Ilya
изначально ты утверждал, что нельзя определить (0 * _ = 0), потому что "не для всех числовых типов есть 0"
Нурлан
изначально ты утверждал, что нельзя определить (0 * _ = 0), потому что "не для всех числовых типов есть 0"
Я утверждаю, что нецелесообразно такое запихивать в определение класса, на твой же вопрос почему так не делают.
Нурлан
Можно в инстанс запихать, но тоже никто не делает
Нурлан
Для integer
Ilya
хах ну ок =)
Ilya
@voidlizard spam
Dmitry
Пингуйте @qnikst я на телефоне
Dmitry
Asyan раз
Dmitry
На телефоне тоже работает
Dmitry
Данеая стилистика беседы не приветствуется
Dmitry
Хорошо
Dmitry
Поправка: не сквернословь как мудак
Нурлан
Походу в школе флуда и троллинга сегодня практический экзамен.
Нурлан
Чёт их много
Dmitry
Извиняем. И раз.
Dmitry
Кучно пошли
Ilya
Затаился 😀
Anonymous
Тут страшно писать теперь.
Dmitry
Страх убивает разум
Влод
не было 40 минут. интересно что тут было
Alexander
In type theory, a theory within mathematical logic, the bottom type is the type that has no values. It is also called the zero or empty type, and is sometimes denoted with falsum (⊥). The bottom type is frequently used for the following purposes: To signal that a function or computation diverges; in other words, does not return a result to the caller. As an indication of error; this usage primarily occurs in theoretical languages where distinguishing between errors is unimportant.
Alexander
сорри я только пришёл
Alexander
bottom не может быть значением