Влод
ну ладно.
one = 1 * one
zero = 0 * zero
Влод
ну это наверное вопрос предпочтений: можно ли к этим значениям применять аналитику, и самостоятельно без компилятора доказывать, что они не равны.
Если да, то боттомы равны в пределах одного конструктора
Ilya
кстати интересно, что ghc не в состоянии вычислить, что zero == 0
Ilya
т.е. там нет фишки типа
0 * _ = 0
Влод
да, я тоже пытался манипулировать этим
Ilya
как для Bool
Влод
потому что * не тайп конструктор)
Ilya
и что, && тоже не конструктор
Ilya
однако False && _ = False
Ilya
а вместо _ может быть чё угодно
Ilya
даже bottom
Ilya
λ> let false = False && false
λ> false
False
λ>
Нурлан
В определении чисел в Haskell не сказано что у них должны существовать 1 и 0
Влод
ну так то мне помнится слово thunk (не вычесленное выражение типа 0 * _) и мне казалось, что хаскель делает какие то подобные оптимизации в рантайме. ну мб только на уровне data типов
Нурлан
Нурлан
И не делают
Ilya
Почему нельзя для Integer такое сделать?
Ilya
в теории
Нурлан
Нурлан
Но * пришла не из integer
Влод
это речь про Num (или как там определен *)
Нурлан
Она определяется в классе чисел
Нурлан
А в классе чисел не для всех чисел есть 0 и 1
Ilya
да я думаю там всё проще
Ilya
умножение передаётся напрямую процессору
Ilya
без всякого паттерн-матчинга
Влод
слушай, а ведь и правда то что False && _ = False определено прямо в инстансе Bool
Нурлан
Умножение через инстанс определяется, но для стандартных типов да
Влод
а инстансы Integer для Num наверное и не нарыть
Влод
они тип платформо-зависмые
Влод
Ilya
но в Num есть функция fromInteger
Ilya
и не просто так она там
Ilya
то есть подразумевается, что соответствие между Integer и Num есть
Ilya
и вполне прямое кстати
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
Ilya
Ilya
как и должно
Ilya
потому что нехрен паттерн-матчить
Ilya
но если бы захотели, то могли бы
Ilya
всё правильно:) и я о том же
Нурлан
Ilya
изначально ты утверждал, что нельзя определить (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
сорри я только пришёл
Ilya
Alexander
bottom не может быть значением