Alexander
Prelude> let undefined = undefined in undefined . id `seq` () () Prelude> let undefined = undefined in undefined `seq` () ^CInterrupted.грустно это
Евгений
кстати, а почему для хаскеля выбрали Hask а не Set? Есть какой то реальный профит от этого, или просто исторически?
Потому что Set выразить невозможно на тьюринг-машине, например в Set есть невычислимые функции. И Hask не выбирали, это название того, что исторически получилось
Alexander
Ну типа это нарушает свойства категории
Евгений
Hask > Set
На категориях нет порядка. Ну и наверное человек спрашивает про категорию Set, а не про универсум типов, так что это не совсем верно. Из н в н есть много нерекурсивных функций
Alexander
В смысле объектов
Alexander
А функторов из или в hask не бывает, так как hask не элемент Cat
Danila Matveev
Думаю, hask и set излморфны
хаск (если считать категорией) сложнее по структуре, поэтому не может быть изоморфен Set
Danila Matveev
А функторов из или в hask не бывает, так как hask не элемент Cat
хаск (если считать категорией) не может не быть в Cat по определению Cat
Alexander
хаск (если считать категорией) не может не быть в Cat по определению Cat
Как минимум если он больше set его не может быть в Cat
Alexander
Плюс его нельзя считать категорией, так что структура мимо
Oleg
Думаю, hask и set излморфны
data PS = P (PS -> Bool) | I
Oleg
А функторов из или в hask не бывает, так как hask не элемент Cat
это просто глупость. Считаете, функторов не бывает между большими категориями?
Oleg
Хотя бы лемму Йонеды перечитайте
Cheese
и что тогда?
тогда семантика будет такая же, и можно data оптимизировать до newtype
Aleksei (astynax)
В эльме обнаружилось ещё одное "прекрасное": type Foo = String у нас бы это было определение data Foo = String И в Elm такое даже компилится, но не работает, естетственно, т.к. конструкторов значений нет
Aleksei (astynax)
Нет
Aleksei (astynax)
Тип
кана
Нет
чет ты в синтаксисе запутался похоже
Aleksei (astynax)
Хмм. Т.е. таки конструктор String создается?
кана
ну да, как и в хаскеле
кана
это же термлевел и тайплевел
Aleksei (astynax)
Да, чёт попутал :)
Aleksei (astynax)
Я сам такое не писал, а вот сегодня наткнулся на такой пример и подумал, что в Эльме опять что-то недокомпиляторили :) Это такой рефлекс уже :)
A64m
не так и сложно, на самом деле. прилично компилировать по возможности раздельно сложнее. просто и сейчас много кто временем компиляции недовольны, что начнется, если она раз в сто больше будет?
Ilya
А функциями вроде performGC часто пользуются в реальных программах?
A64m
нет (ну, для бенчмарков используются)
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
Ох. Спасибо.
Евгений
не так и сложно, на самом деле. прилично компилировать по возможности раздельно сложнее. просто и сейчас много кто временем компиляции недовольны, что начнется, если она раз в сто больше будет?
Я помню моей первой и единственной серьёзной программой на mlton был не очень большой CRUD, строк так на 5-10 тысяч. Компилировалось оно целую вечность. Но вообще можно запилить полнопрограмный анализ отдельной опцией компиляции
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)
Это как 1/0 получился наном?
Точно. Это я наврал. 1/0 это Infinity
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)
Aleksei (astynax)
nan, это что вообще?
Aleksei (astynax)
В base нету такой
Anonymous
У NaN есть всякие (F/A/M) instances?
Vladimir
Это нан, можно определить как 0/0, можно как inf/inf, без разницы.
Aleksei (astynax)
У NaN есть всякие (F/A/M) instances?
как у значения могут быть инстансы?
Aleksei (astynax)
Всё логично
Aleksei (astynax)
Неопределённость же. Нельзя сравнивать такие
Vladimir
0/0 == NaN
Поинт в том, что нан -- это такой дабл, который не равен себе. Он единственный в своём роде. Чуть не в стандарте описан способ сделать isNaN x = x /= x