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
Oleg
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
Alexandr
просто выходит, что если объявить инстанс для инта, то тогда все задервайвится и будет работать, но при этом не будет возможности использовать bar для любых Ord, Num
Oleg
нижний инстанс может существовать только в единственном числе
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
Oleg
Alexander
Alexander
там ограниченная глубина
Alexander
нинада так, есть же default signatures
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
Sherzod
parket
😂👍
Vladislav
😒 Нельзя просто взять и налепить надпись "бифункторы" на каких-то аниме-персонажей.
Sherzod
Sherzod
Vladislav
Что они проясняют-то? Связи никакой, не остроумно
Sherzod
Вот это тоже нельзя?
Влод
Vladislav
Я не знаю, является ли неправильно написанное слово "мемоизация" какой-то отсылкой к чему-то.
parket
Влод
Хотя мб если посмотреть тайтл то всё встанет на свои места
Alexandr
он этого хотел, вот так это получается
немного не то, я просто как думал, у нас есть тайпкласс Foo и мы можем для Int создать инстанс, но почему бы не сделать того же для тайпкласса, например Num. Потом мы например объявляем newtype например с Int, для Int функция, которую мы объявили работает, значит поидее можно вывести тайпкласс Foo для newtype
Sherzod
parket
Я думаю, похвально, что человек что-то пытается сделать. Вместо критики, лучше правки вносите.
Vladislav
Они тоже Би.
Так и знал, что из всех возможных интерпретаций выберут самую дурацкую.
Sherzod
Vladislav
Господи, только слово "функтор" уберите из этого безобразия
Sherzod
Хорошо, а что неправильно в слове мемоизация?
Vladislav
parket
Vladislav
На чем?