Ilya
но если ввести доменное имя, то попадаю именно на сайт, а не на Welcome to nginx
Алексей
❌ 52.71.209.192 заблокирован, идентификатор записи #884508
Алексей
❌ 52.72.159.235 заблокирован, идентификатор записи #884508
Алексей
Он, вероятно, на хост в HTTP запросе смотрит
A64m
у меня сегодня стекедж доступен, но пару дней назад не был
Ignat
Alexander
Чорд, спалился!
Alexander
Да ладно, не сегодня же. Все уже в прошлом!
Ignat
Да все плюсовики так говорят
Alexander
У меня нет зависимости! Захочу - брошу фри-монады.
Ignat
А брат как себя чувствует?
Alexander
Жив, по последним данным
NC
Забавно, VSCode тоже нельзя скачать без VPN
Dmitry
Лишь бы только VPN можно было скачивать
Нурлан
Кто сталкивался с Constraint?
Нурлан
Expected a type, but ‘Zp a’ has kind ‘Constraint’
Нурлан
не могу понять как это обойти
Нурлан
class Zp a where
genP :: a
genQ :: a -- генератор мультипликативной секьюрной подругрппы
pBase :: a
qBase :: a
toZp :: Integer -> a
fromZp :: a -> Integer
instance Num (Zp a) where
fromInteger = toZp :: a -> Zp a
(+) a b = fromInteger $ (fromZp a) + (fromZp b)
(*) a b = fromInteger $ (fromZp a) * (fromZp b)
(-) a b = fromInteger $ (fromZp a) - (fromZp b)
negate = (-) pBase
Aleksei (astynax)
Ошибка говорит, что вы пытаетесь инстанциировать класс Num для класса, а это делается для типов
Aleksei (astynax)
Думаю, вы хотите instance Zp a => Num a where
Нурлан
сделал так, возникло много прагм (кажется они так называются) и ghci говорит что код неправильный
Aleksei (astynax)
Требование расширений, это нормально.
Нурлан
ну хотя бы я внутрь объявленя класса зашел в компиляции :)
Aleksei (astynax)
ещё неправильно написана сигнатура a -> Zp a
Aleksei (astynax)
Zp - это класс, а не тип. Поэтому он ожидается в позиции констреинта
Aleksei (astynax)
T.е. правильная сигнатура будет выглядеть так
fromInteger :: Zp a => Integer -> a
Нурлан
Нурлан
но пока сложности еще есть
Aleksei (astynax)
Но дальше будет больше проблем.
Нурлан
а в классы вообще нельзя передавать классы?
Aleksei (astynax)
Только в роли констреинта
Aleksei (astynax)
И это не "передавать"
Нурлан
cмысл понял
Aleksei (astynax)
Констреинты, это просто подсказки для компилятора, позволяющие отсечь overlapping instances
Aleksei (astynax)
В данном сулчае мы имеем проблему - констреинт Zp a => никак не "уменьшает" область поиска инстансов. И для компилятора нет разницы между нстансами
instance Zp Int => Num Int where
и
instance Num Int where
Aleksei (astynax)
Т.о. компилятор не может выбрать, какой "плюс" использовать:
(+) :: (Zp a, Num a) => a -> a -> a или (+) :: Num a => a -> a -> a
Нурлан
а как это обходится?
Aleksei (astynax)
Заворачиванием в newtype
Нурлан
может сигнатуру прописать к функции (+) ?
Aleksei (astynax)
Нужно завести тонкую обёртку
class Zp a where
...
newtype Zpable a = Zpable a
instance Zp (Zpable Int) where
...
instance Num (Zpable a) where
...
Aleksei (astynax)
Тут чётко отделены типы, которые умеют Zp от всех остальных, которые умеют Num сами по себе
Нурлан
как громоздко однако
Нурлан
сейчас буду пробовать
Нурлан
спасибо
Aleksei (astynax)
Добавился по сути один newtype и немного изменились сами инстансы. Не сильно более громоздко стало
Нурлан
я предполагал создать еще структуру данных с именем FiniteField это видимо то что нужно запихивать в newtype
Нурлан
я думал так: создам классы, которые буду нанизывать один на другой, а в самом основании будет тип данных
Нурлан
нанизывать видимо нельзя, можно "ограничивать"
Aleksei (astynax)
Тут проблема не в самом подходе
Нурлан
и тип данных надо как-то еще крутить на всех уровнях
Aleksei (astynax)
Просто нельзя навешивать класс (констреинт) на уже существующую связку (инстанс) тип - класс
Нурлан
а если я запилю свои собственные классны с инстансами с блекджеком и дамами?
Нурлан
без существующих инстансов
Нурлан
не пересекаясь
Aleksei (astynax)
Тогда будет работать
Aleksei (astynax)
Проблема в конкретном пересечении Num a и Zp a => Num a
Нурлан
первый код я так и написал, но мне захотелось использовать + вместо <+>
доня.
Aleksei (astynax)
newtype же решит проблему, не?
можно будет писать 1 + 2 * 3 и подразумевать Zpable Int, например
Aleksei (astynax)
Тут как раз помогает fromInteger - числовые литералы "апгрейдятся" до типа-обёртки
Нурлан
пока не понимаю, для меня 'newtype = data'
Aleksei (astynax)
newtype это "как data", но выкидывается компилятором после проверки типов
Нурлан
тэкс, а куда ее навешивать?
Нурлан
класс Zp сделать newtype ?
Aleksei (astynax)
Я же выше "рыбу" написал :)
Aleksei (astynax)
Нужно завести тонкую обёртку
class Zp a where
...
newtype Zpable a = Zpable a
instance Zp (Zpable Int) where
...
instance Num (Zpable a) where
...
Aleksei (astynax)
Класс остаётся тем же
Нурлан
Aleksei (astynax)
Просто инстансы Zp пишутся не для Int, а для Zpable Int
Нурлан
доня.
класс Zp сделать newtype ?
у тебя видимо немного путаница между типами и классами типов в голове)
newtype (как и data) — это создание нового типа, а не класса
Aleksei (astynax)
Да ладно, это сложно с непривычки. Все путаются
Нурлан
доня.
Нурлан
:)
доня.
я ж без наезда
я вообще самый нетоксичный человек в русскоязычном коммьюнити!
Нурлан
поэтому удивляюсь тому как я понял некоторые вещи :)
Aleksei (astynax)
Классы обычно не участвуют в описании типа, точнее для них есть особое место - место для указания ограничений