Vladislav
Это core lint failures и полная неюзабельность промоутных GADT-ов (main selling point of TypeInType).
Vladislav
Я его включаю для кайнд-синонимов
Vladislav
А что-то толковое выжать на данный момент трудно.
Евгений
кана
Add * :: *. Why do this? One alternative is to go the route of Coq and Agda and have an infinite tower of type universes. But, this adds a lot of complexity. These languages take this route because * :: * makes a language inconsistent as a logic. However, Haskell is already inconsistent as a logic (because of undefined and GHC.Exts.Any) and so we don't have to worry about a new source of inconsistency.
Очень нравится этот абзац.
Vladislav
Не, все очень хорошо, это правильный дизайн для Haskell
Евгений
По-моему произошло что-то очень странно и программисты стали воспринимать зависимые типы как ещё один способ полиморфизма >...>
Vladislav
Даже в Agda сначала иногда с --type-in-type доказываешь для удобства, потом делаешь нормально.
Евгений
Но с type in type можно доказать что угодно
Кабачок
Vladislav
Нельзя
Anonymous
Vladislav
А в Хаскеле пруфы надо редьюсить до NF
кана
Это мощность типа?
ну там пример про множества, не про типы, логика кванторов та же, полагаю
Vladislav
Ну в рантайме у тебя уйдет в цикл, а так будто боттома не было.
Vladislav
От этого ты unsafeCoerce не получишь, и на том ладно
Vladislav
Вот когда захочется proof erasure, тогда надо будет еще и тоталити-чекер придумывать, которого тоже на горизонте даже нет.
Vladislav
Хоть Type:Type сделали бы, заживём.
Евгений
Ну смысл зав.типов в том, чтобы получить внутри тьюринг-полного языка тотальное подмножество же
Vladislav
Ну вот и не в этом смысл
Vladislav
Для Хаскелиста смысл в том, чтобы сигму и пи получить
Vladislav
а доказывать что-то серьезное небось никто и не будет
Vladislav
(а кто будет об этом пожалеет)
Vladislav
Я не про то
Vladislav
Вот если у тебя есть let x = x in x :: Void, ты зафорсишь в рантайме и уйдешь в цикл, и никакой False ты в рантайме не доказал
Vladislav
так же и с Жираром
Vladislav
составишь циклящийся тёрм, а в рантайме-то тебе что с того?
Евгений
Vladislav
парадокс Жирара основывается на тёрме без нормальной формы
Vladislav
если нет proof erasure и в рантайме для доставания пруфа делается NF, то уйдешь в цикл
Vladislav
это просто еще один боттом, к которым все в Хаскеле привыкли и смирились
Vladislav
делать иерархию универсумов без тоталити чекера не надо никому
Vladislav
а делать тоталити чекер для Хаскеля в 300 раз амбициознее, чем DependentHaskell
Vladislav
а сигма и пи полезны и с Type:Type
Vladislav
Составь Refl :: Int :~: Bool с Type:Type, тогда можно паниковать
Vladislav
а я утверждаю, что ты составишь только bottom :: Int :~: Bool
Vladislav
и никому от этого ни горячо, ни холодно
Vladislav
потому что я и без того могу:
sueMe :: Int :~: Bool
sueMe = sueMe
Vladislav
только GHC требует матчнуть на этой штуке:
oops :: a :~: b -> a -> b
oops Refl = id
Vladislav
и если ты сделаешь oops sueMe, то ты получишь не unsafeCoerce, а цикл
Vladislav
вот это рассуждение вообще заложено в основу дизайна DependentHaskell, и это хороший, прагматичный подход
Евгений
Вы по-моему меня не понимаете. Мой тезис в следующем: пи и сигма нужны только как инструменты доказательства тотальности. А иметь в языке пи, сигму "просто чтобы было" особо никому и не нужно. Просто ещё одна возможность сделать что-то неправильно
Vladislav
А это в корне неверный тезис
murad
Почему?
Vladislav
Потому что пи и сигма добавляются не "просто чтобы было", а чтобы инварианты данных обеспечивать.
Vladislav
Которые будут вполне реально обеспечены пока пруфтёрмы редьюсятся в NF
murad
Женя, согласен?
Кабачок
Евгений
Vladislav
А пример можно?
printf :: (s :: String) -> PrintfParams s -> IO ()
Vladislav
printf "Result is %f with %d accuracy" :: (Double, Integer) -> IO ()
Vladislav
printf "Hello, World" :: () -> IO ()
Vladislav
в общем как в Си, только тайпсейф за счёт Пи
Alexander
товарищи, а кто такой LDouble?
Зигохистоморфный
Alexander
hsc2hs
Зигохистоморфный
ну я только тут видел https://www.stackage.org/haddock/lts-10.0/inline-c-0.6.0.5/Language-C-Types.html#v:LDouble
Alexander
if test "$HTYPE_IS_FLOAT" -eq 1
then
AC_CV_NAME=Float
elif test "$HTYPE_IS_DOUBLE" -eq 1
then
AC_CV_NAME=Double
elif test "$HTYPE_IS_LDOUBLE" -eq 1
then
AC_CV_NAME=LDouble
else
AC_CV_NAME_supported=no
fi
Alexander
не это не то
Alexander
#define hsc_type(t...) \
if ((t)(int)(t)1.4 == (t)1.4) \
hsc_printf ("%s%lu", \
(t)(-1) < (t)0 ? "Int" : "Word", \
(unsigned long)sizeof (t) * 8); \
else \
hsc_printf ("%s", \
sizeof (t) > sizeof (double) ? "LDouble" : \
sizeof (t) == sizeof (double) ? "Double" : \
"Float");
Зигохистоморфный
#type C_type
A Haskell equivalent of the C numeric type will be output. It will be one of {Int,Word}{8,16,32,64}, Float, Double, LDouble.
Алексей
long double? (10 bytes)
Anonymous
S
Anonymous
/stat@combot
Combot
combot.org/chat/-1001043143583
Anonymous
Alo
Anonymous
https://ghc.haskell.org/trac/ghc/ticket/12919
https://ghc.haskell.org/trac/ghc/ticket/12564
Anonymous
почему странно?
Anonymous
А почему второе утверждение неверное? Импликации ни тепло ни холодно от заведомо ложной посылки.
Denis
А кто нибудь использует VS Code для разработки?
Anonymous
иногда
Oleg
кана
Alexander
да
Kirill
@qnikst ты завязал с вимом?
Denis
смог выйти
Denis
Какой набор расширений используете? Работает ли Jump to definition?