Oleg
Use FlexibleInstances
Kirill
дык да: FlexibleInstances
Aleksei (astynax)
Ага, компилятор даже подсказывает, что включить
Alexandr
ну это от части помогает, но потом
Alexandr
error: • The constraint 'Ord a' is no smaller than the instance head (Use UndecidableInstances to permit this) • In the instance declaration for 'Foo a'
Kirill
» UndecidableInstances
Aleksei (astynax)
Ага
Aleksei (astynax)
Но могут быть проблемы с выводом типов - он не завершится (зациклится) :)
Kirill
я вроде что-то подобное делал и вполне работало
Aleksei (astynax)
Оно работает пока не сломается :)
Aleksei (astynax)
Я про UndecidableInstances
Kirill
Лол
Oleg
да, на простом всё норм
Oleg
Alexandr
а есть норм вики про прагмам?
Aleksei (astynax)
Есть - дока по GHC
Vasiliy
говорят, что UndecidableInstances никаких проблем не влечёт
Vasiliy
проблемы от IncoherentInstances
Aleksei (astynax)
Ну потенциально компилер может запомнить, что он уже нашел инстанс для некоего типа, но не обязан - это я про "is no smaller than"
Alexandr
у меня была такая проблема с кодом, я сделал newtype для Int, потом засунул его в bar и вышла ошибка, о том, что есть несколько инстансов
Alexandr
ща
Alexandr
{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE UndecidableInstances #-} class Foo a where bar :: a -> Bool newtype Int' = Int' Int deriving (Eq, Show, Foo) instance (Num a, Ord a) => Foo a where bar n = n > 10
Oleg
Ну правильно
Oleg
ты пытаешь вывести инстанс для Int', в то время как ниже объявляешь инстанс для всех типов вообще
Oleg
они пересекаются
Aleksei (astynax)
Надо параметризовать ньютайп
Oleg
засунь тогда нижний инстанс тоже в ньютайп
Aleksei (astynax)
нижний инстанс вообще не отностится к Int' никак, т.к. ньютайп не инстанциирует орд и не нум
Aleksei (astynax)
Но т.к. инстанс - всеядный, то получется, он подходит и для Int'
Oleg
нижний инстанс вообще не отностится к Int' никак, т.к. ньютайп не инстанциирует орд и не нум
а для определения какой инстанс использовать это не важно, это же не скалка
Alexandr
просто выходит, что если объявить инстанс для инта, то тогда все задервайвится и будет работать, но при этом не будет возможности использовать bar для любых Ord, Num
Oleg
нижний инстанс может существовать только в единственном числе
Oleg
нижний инстанс вообще не отностится к Int' никак, т.к. ньютайп не инстанциирует орд и не нум
компилятор не может гарантировать, что где-то дальше не найдётся орфант инстанс нума и орда для Int'
Aleksei (astynax)
class Foo a where bar :: a -> Bool newtype Fooable a = Fooable a deriving (Eq, Show, Foo) instance (Num a, Ord a) => Foo (Fooable a) where bar (Fooable n) = n > 10
Alexander
там ограниченная глубина
Alexander
нинада так, есть же default signatures
Aleksei (astynax)
там ограниченная глубина
Ну тогда ок, я спокоен :)
Aleksei (astynax)
default signatures для дерайвинга?
Alexander
class Foo a where foo :: a -> Bool instance Foo a where foo :: a -> Bool default foo :: (Num a, Ord a) => a -> Bool foo n = n > 10
Aleksei (astynax)
Тут это всё равно не поможет, т.к. обёртка Int' - не Num
Alexander
реализация дефолтная для типов попадающих под определенные ограничения
Alexander
сделать Num это проблема?
Aleksei (astynax)
Этого может не хотеться по определённым причинам
Alexander
каким?
Alexander
тогда не должно хотеться, чтобы тайпкласс для него работал
Alexander
точнее чтобы дефолтная релазация работала
Alexander
а блин
Alexander
я тупой
Alexander
default foo в определении класса конечно же
Aleksei (astynax)
Чтобы нельзя было получить 1 + 2 :: Int' может не хотеться Num
Alexander
` class Foo a where foo :: a -> Bool default foo :: (Num a, Ord a) => a -> Bool foo n = n > 10 instance Foo Int instance Foo Int' where foo (Int' x) = True ``
Alexander
@astynax ^
Aleksei (astynax)
Это я понял, да
Alexander
он этого хотел, вот так это получается
Sherzod
Я тут обещал вам про бифункторы, профункторы и гистоморфизмы стикеры... 2 готовы, не против если запощу?
parket
😂👍
Vladislav
😒 Нельзя просто взять и налепить надпись "бифункторы" на каких-то аниме-персонажей.
Sherzod
Vladislav
Что они проясняют-то? Связи никакой, не остроумно
Sherzod
Вот это тоже нельзя?
Vladislav
Я не знаю, является ли неправильно написанное слово "мемоизация" какой-то отсылкой к чему-то.
Влод
Хотя мб если посмотреть тайтл то всё встанет на свои места
Alexandr
он этого хотел, вот так это получается
немного не то, я просто как думал, у нас есть тайпкласс Foo и мы можем для Int создать инстанс, но почему бы не сделать того же для тайпкласса, например Num. Потом мы например объявляем newtype например с Int, для Int функция, которую мы объявили работает, значит поидее можно вывести тайпкласс Foo для newtype
parket
Я думаю, похвально, что человек что-то пытается сделать. Вместо критики, лучше правки вносите.
Vladislav
Они тоже Би.
Так и знал, что из всех возможных интерпретаций выберут самую дурацкую.
Sherzod
Так и знал, что из всех возможных интерпретаций выберут самую дурацкую.
Отчасти ты прав, там нужно три персонажа. Два би и ребенок :(
Vladislav
Господи, только слово "функтор" уберите из этого безобразия
Sherzod
Хорошо, а что неправильно в слове мемоизация?
Vladislav
Хорошо, а что неправильно в слове мемоизация?
То, что оно написано там не так
Vladislav
На чем?