Alexander
Prelude> let undefined = undefined in undefined . id `seq` ()
()
Prelude> let undefined = undefined in undefined `seq` ()
^CInterrupted.грустно это
Oleg
Cheese
Alexander
Ну типа это нарушает свойства категории
Евгений
Hask > Set
На категориях нет порядка. Ну и наверное человек спрашивает про категорию Set, а не про универсум типов, так что это не совсем верно. Из н в н есть много нерекурсивных функций
Oleg
Alexander
Alexander
В смысле объектов
Alexander
А функторов из или в hask не бывает, так как hask не элемент Cat
Alexander
Alexander
Плюс его нельзя считать категорией, так что структура мимо
Oleg
Хотя бы лемму Йонеды перечитайте
A64m
Oleg
Cheese
и что тогда?
тогда семантика будет такая же, и можно data оптимизировать до newtype
Aleksei (astynax)
В эльме обнаружилось ещё одное "прекрасное":
type Foo = String
у нас бы это было определение
data Foo = String
И в Elm такое даже компилится, но не работает, естетственно, т.к. конструкторов значений нет
A64m
кана
Aleksei (astynax)
Нет
Aleksei (astynax)
Тип
кана
Нет
чет ты в синтаксисе запутался похоже
Aleksei (astynax)
Хмм. Т.е. таки конструктор String создается?
кана
ну да, как и в хаскеле
кана
это же термлевел и тайплевел
Aleksei (astynax)
Да, чёт попутал :)
Aleksei (astynax)
Я сам такое не писал, а вот сегодня наткнулся на такой пример и подумал, что в Эльме опять что-то недокомпиляторили :) Это такой рефлекс уже :)
Антон
A64m
не так и сложно, на самом деле. прилично компилировать по возможности раздельно сложнее. просто и сейчас много кто временем компиляции недовольны, что начнется, если она раз в сто больше будет?
Ilya
А функциями вроде performGC часто пользуются в реальных программах?
Антон
A64m
нет
(ну, для бенчмарков используются)
Alexander
Alexander
у меня в двух местах использовалось, в одном из мест было не обязательно
Aminion
Прохожу на степике курс, задание о безопасном итерировании
class (Eq a, Enum a, Bounded a) => SafeEnum a where
ssucc :: a -> a
ssucc a
| a == maxBound = minBound
| otherwise = succ a
spred :: a -> a
spred a
| a == minBound = maxBound
| otherwise = spred a
Aminion
Failed. Runtime error
main: <<loop>>
Выдает такое вот.
Aminion
Локально в терминале все ок
Ignat
> spred a = spred a
Aminion
Ох. Спасибо.
Aliester
скоро у нас кроме компилятора будет отдельный оптимизатор, баг превентер и анализатор который будет крыть матом нерадивых программистов
Слава
Aliester
а код тестировать не надо будет
Aliester
верифайер сам все автоматически верфицирует
Ilya
как-то рид странно работает.
в гхци пробую
λ> read "NaN" :: Double
NaN
в файле задефайнен
minusNaN, nan, inf, minusInf :: Double
minusNaN = read "-NaN"
nan = read "NaN"
но при выполнении получаю в этом месте
Exception: Prelude.read: no parse
что успевает поменяться?
Ilya
ну и кстати если кто-то подскажет человеческий способ как работать с всякими неканоничными нанами будет здорово
Ilya
а, похоже ieee754 умеет, проглядел когда первый раз его смотрел https://hackage.haskell.org/package/ieee754-0.8.0/docs/Numeric-IEEE.html#v:nanWithPayload
Alexander
Prelude> read "NaN" :: Double
NaN
Alexander
а, туплю, я тоже в ghci
Alexander
runhaskell << EOF
heredoc> nan :: Double
nan = read "NaN"
main = print nan
EOF
NaN
Ilya
да, я понимаю что выглядит как волшебство. я в итоге поменял на nan из пакетика ieee-754 и всё стало хорошо. почему не работал read забил разбираться
Aleksei (astynax)
> 1 / 0
NaN
Aleksei (astynax)
так что можно и без read :)
Vladimir
Это как 1/0 получился наном?
Vladimir
0/0 должен был быть, наверное.
Alexander
поддельный ghci!
Ilya
Ну как-то не самодокументированно всё равно выглядит
Aleksei (astynax)
0/0 == NaN
Anonymous
Не удобнее ли ловить NaN Either и т.п.?
Напр., своей версией '/'
Alexander
NaN нормальный же
Vladimir
Кстати, 0/0 /= NaN ;)
Alexander
не bottom и замечательно
Aleksei (astynax)
Кстати, 0/0 /= NaN ;)
λ> 1/0
Infinity
λ> 0/0
NaN
λ> 0/1
0.0
λ> (1/0)/(1/0)
NaN
Aleksei (astynax)
Вот прямо скопипастил из ghci
Aleksei (astynax)
Vladimir
Aleksei (astynax)
nan, это что вообще?
Aleksei (astynax)
В base нету такой
Anonymous
У NaN есть всякие (F/A/M) instances?
Vladimir
Это нан, можно определить как 0/0, можно как inf/inf, без разницы.
Aleksei (astynax)
Aleksei (astynax)
Всё логично
Aleksei (astynax)
Неопределённость же. Нельзя сравнивать такие
Vladimir
0/0 == NaN
Поинт в том, что нан -- это такой дабл, который не равен себе. Он единственный в своём роде. Чуть не в стандарте описан способ сделать isNaN x = x /= x